Introducción

Descripción general

Dependiendo de su message log configuración para usar Kafka o Base de datos, el despliegue podría ser ligeramente diferente.

Kafka Message Log ging

overview-kafka
  • NetOwl Namematcher - Utilizado por VoP a través de la Resolución de Identidad (integrada) como el proveedor externo para la coincidencia de nombres.

  • Gestión de Cuentas - Utilizado por VoP para consultar los detalles de la cuenta utilizados en la coincidencia

  • Base de datos - Utilizado para la concesión de licencias

  • Kafka - Utilizado por VoP para el registro de mensajes y el almacenamiento del archivo de procesamiento

Base de datos Message Log ging

overview-database
  • NetOwl Namematcher - Utilizado por VoP a través de la Resolución de Identidad (integrada) como el proveedor externo para la coincidencia de nombres.

  • Gestión de Cuentas - Utilizado por VoP para consultar los detalles de la cuenta utilizados en la coincidencia

  • Base de datos - Utilizado para la concesión de licencias y el registro de mensajes

  • Kafka - Utilizado por VoP para almacenar el archivo de procesamiento

Configuración y Tiempo de Ejecución

La Verificación del Beneficiario (VoP) es una aplicación independiente que puede ejecutarse como un servicio, al igual que cualquier otro IPF application despliegue. El VoP El servicio Responder puede ejecutarse como una única instancia o múltiples.

Configuración

La configuración de docker compose a continuación es la mínima requerida para el VoP Servicio de respuesta para ejecutarse utilizando Kafka para el registro de mensajes y MongoDB para la concesión de licencias.

VoPResponder no requiere un Akka Cluster a ser configurado.
ipf {
  mongodb.url = "mongodb://ipf-mongo:27017/vop"  (1)
}

common-kafka-client-settings {
  bootstrap.servers = "kafka:9092" (2)
}

akka {
  kafka {
    producer {
      kafka-clients = ${common-kafka-client-settings}
    }
    consumer {
      kafka-clients = ${common-kafka-client-settings}
      kafka-clients.group.id = vop-responder-consumer-group
    }
  }
}

ipf.verification-of-payee.responder {
  name-match { (3)
    thresholds = [
      {
        processing-entity = "default",
        scorings: [
          {type: "default", lowerbound = 0.80, upperbound = 0.90}
        ]
      }
    ]
  }
  account-management.http.client {
    host = account-management-sim (4)
    port = 8080
  }
  country-filtering.enabled = true (5)
  scheme-allowed-countries = [
    {
      scheme: EPC, (5)
      regulatory-date-timezone: "Europe/Berlin" (5)
      allowed-countries: [
        {country-code: "de", regulatory-date: "2026-09-17"}, (5)
        {country-code: "fr"}
      ]
    }
  ]
}

identity-resolution.comparison.netowl {
  default {
    http.client {
      host = netowl-namematcher (6)
      port = 8080
    }
  }
  table {
    http.client {
      host = netowl-namematcher (6)
      port = 8080
    }
  }
}

Tenga en cuenta los siguientes aspectos clave:

1 Establezca el MongoDB URL según corresponda a su entorno
2 Establezca el Kafka URL según corresponda a su entorno
3 Establezca el Coincidencia de Nombres umbrales requeridos para su implementación
4 Establezca el Gestión de Cuentas nombre de host y puerto según corresponda a su entorno
5 Establezca el Filtrado por País y defina qué códigos de país están permitidos para cada esquema con fecha y hora regulatoria opcional y zona horaria.
6 Establezca el Resolución de Identidad NetOwl nombre de host y puerto según corresponda a su entorno

Ejecutando

Docker Componer

El siguiente docker compose es un VoP Despliegue del servicio Responder que contiene toda la infraestructura/aplicaciones requeridas (Kafka,MongoDB, NetOwl, Gestión de Cuentas) necesaria para ejecutar el VoP Aplicación de respuesta. Esta implementación de muestra se está ejecutando con Kafka para el registro de mensajes y MongoDB para la concesión de licencias.

Esto representa una configuración de muestra y no está destinado a representar preocupaciones de rendimiento o resiliencia, las cuales se abordarán en otra sección en futuras versiones.
Docker Compose
services:

  # Infrastructure
  ipf-mongo:
    image: ${docker.registry}/ipf-docker-mongodb:latest
    container_name: ipf-mongo
    ports:
      - "27018:27017"
    healthcheck:
      test: echo 'db.runCommand("ping").ok' | mongo localhost:27017/test --quiet

  kafka:
    image: apache/kafka-native:4.0.0
    container_name: kafka
    ports:
      - "9092:9092"
      - "9093:9093"
    environment:
      - KAFKA_NODE_ID=1
      - KAFKA_AUTO_CREATE_TOPICS_ENABLE=true
      - KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9094
      - KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER
      - KAFKA_PROCESS_ROLES=broker,controller
      - KAFKA_LOG_RETENTION_MINUTES=10
      - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
      - KAFKA_OFFSETS_TOPIC_NUM_PARTITIONS=1
      - KAFKA_LISTENERS=PLAINTEXT://:9092,LOCAL://:9093,CONTROLLER://:9094
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=LOCAL:PLAINTEXT,PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,LOCAL://localhost:9093
      - KAFKA_CREATE_TOPICS=MESSAGE_LOG:1:1,PROCESSING_ARCHIVE:1:1

  # Apps
  account-management-sim:
    image: ${docker.registry}/account-management-simulator:${project.version}
    container_name: account-management-sim
    ports:
      - "8082:8080"
      - "55555:55555"
      - "5006:5005"
    volumes:
      - ${docker-logs-directory}:/ipf/logs
      - ./config/account-management-sim:/account-management-simulator/conf
    user: "1000:1000"
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:55555/statistics" ]
      interval: 1s
      timeout: 1s
      retries: 90

  netowl-namematcher:
    image: ${docker.registry}/netowl-namematcher:4.9.5.2
    container_name: netowl-namematcher
    ports:
      - "8081:8080"
    volumes:
      - ./config/netowl-namematcher:/var/local/netowl-data/
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:8080/api/v2" ]
      interval: 1s
      timeout: 1s
      retries: 90

  vop-responder-app:
    image: ${docker.registry}/verification-of-payee-responder-application:${project.version}
    container_name: vop-responder-app
    ports:
      - "8080:8080"
      - "5005:5005"
    volumes:
      - ${docker-logs-directory}:/ipf/logs
      - ./config/vop-responder-app:/verification-of-payee-responder-application/conf
    user: "1000:1000"
    environment:
      - IPF_JAVA_ARGS=-Dma.glasnost.orika.writeClassFiles=false -Dma.glasnost.orika.writeSourceFiles=false -Dconfig.override_with_env_vars=true
    depends_on:
      - ipf-mongo
      - kafka
    healthcheck:
      test: [ "CMD", "curl", "http://localhost:8080/actuator/health" ]

Tenga en cuenta los siguientes aspectos clave:

  • MongoDBy Kafka los contenedores son imágenes de terceros y no son proporcionadas por Icon Soluciones

  • El Simulador de Gestión de Cuentas se ha añadido con fines ilustrativos y no es proporcionado por Icon Soluciones pero debería ser un customer implementación conforme a la API de Gestión de Cuentas

  • El NetOwl la imagen anterior es un contenedor de terceros no suministrado por Icon Las soluciones y actualmente está siendo utilizadas por el Servicio de Resolución de Identidad, que se está ejecutando embebido en el VoP Aplicación Responder. Para más detalles sobre esto, por favor revise el Resolución de Identidad documentación. Si ya existe una instancia separada en el customer entorno, cualquier customisations debe ser reaplicado aquí si se utiliza una nueva imagen.

  • El VoP La aplicación Responder es creada por Icon Soluciones y alojadas en nuestro ipf-lanzamientos repositorio en Nexus.

Kubernetes

El siguiente Kubernetes la configuración es un VoP Despliegue del servicio Responder que contiene la configuración recomendada para desplegar un VoP Aplicación de respuesta. Esta implementación de muestra se está ejecutando con Kafka para el registro de mensajes.

Esto representa una configuración de muestra y no está destinado a representar preocupaciones de rendimiento que se tratarán en otra sección en futuras versiones.
Configmap
apiVersion: v1
kind: ConfigMap
metadata:
  name: responder-config
  labels:
    app: verification-of-payee-responder
    product: ipfv2
data:
  application.conf: |
    ipf.mongodb.url = "mongodb://mongo:27017/vop"
    server.port = 8081
    
    identity-resolution.comparison.netowl {
      default {
        http.client {
          host = localhost
          port = 8080
        }
      }
      table {
        http.client {
          host = localhost
          port = 8080
        }
      }
    }
    
    ipf.verification-of-payee.responder {
      name-match {
        thresholds = [
          {
            processing-entity = "default",
            scorings: [
              {type: "default", lowerbound = 0.80, upperbound = 0.90}
            ]
          }
        ]
      }
      account-management.http.client {
        host = account-management
        port = 8080
      }
      country-filtering.enabled = true
      scheme-allowed-countries = [
        {
          scheme: EPC,
          regulatory-date-timezone: "Europe/Berlin"
          allowed-countries: [
            {country-code: "de", regulatory-date: "2026-09-17"},
            {country-code: "fr"}
          ]
        }
      ]
    }
    
    common-kafka-client-settings {
      bootstrap.servers = "kafka:9092"
    }
    akka {
      kafka {
        producer {
          kafka-clients = ${common-kafka-client-settings}
        }
        consumer {
          kafka-clients = ${common-kafka-client-settings}
          kafka-clients.group.id = vop-responder-consumer-group
        }
      }
    }

  license.key: |-
    {
      "product":"NameMatcher",
      "type":"Development",
      "thread limit":1,
       "*":{
          "lifespan":[ "2022-01-01 00:00Z", "2026-01-01 00:00Z" ],
          "features":[ "Latin" ]
       },
      "verification":<hidden>
    }
Despliegue
apiVersion: apps/v1
kind: Deployment
metadata:
  name: verification-of-payee-responder-application
  labels:
    app: verification-of-payee-responder-application
    product: ipfv2
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  selector:
    matchLabels:
      app: verification-of-payee-responder-application
      product: ipfv2
  template:
    metadata:
      labels:
        app: verification-of-payee-responder-application
        product: ipfv2
    spec:
      imagePullSecrets:
        - name: registry-credentials
      terminationGracePeriodSeconds: 10
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                    - key: app
                      operator: In
                      values:
                        - verification-of-payee-responder-application
                topologyKey: "kubernetes.io/hostname"
      containers:
        - name: verification-of-payee-responder-application
          image: registry.ipf.iconsolutions.com/verification-of-payee-responder-application:latest
          ports:
            - containerPort: 8081
              name: server-port
            - containerPort: 5005
              name: debug-port

          env:
            - name: "IPF_JAVA_ARGS"
              value: "-Dma.glasnost.orika.writeClassFiles=false -Dma.glasnost.orika.writeSourceFiles=false"

          livenessProbe:
            httpGet:
              path: /actuator/health
              port: "server-port"
              scheme: HTTP
            initialDelaySeconds: 60
            periodSeconds: 5
            timeoutSeconds: 1
            failureThreshold: 3
            successThreshold: 1

          readinessProbe:
            httpGet:
              path: /actuator/health
              port: server-port
              scheme: HTTP
            initialDelaySeconds: 60
            periodSeconds: 5
            timeoutSeconds: 1
            failureThreshold: 3
            successThreshold: 1

          startupProbe:
            httpGet:
              path: /actuator/health
              port: server-port
              scheme: HTTP
            failureThreshold: 30
            periodSeconds: 10

          volumeMounts:
            - name: application-config
              mountPath: /verification-of-payee-responder-application/conf/application.conf
              subPath: application.conf

        - name: netowl-namematcher
          image: registry.ipf.iconsolutions.com/netowl-namematcher:latest
          imagePullPolicy: IfNotPresent

          ports:
            - containerPort: 8080
              name: netowl-port

          livenessProbe:
            httpGet:
              path: /api/v2/healthy
              port: 8080
            initialDelaySeconds: 15
            timeoutSeconds: 2
            periodSeconds: 5

          volumeMounts:
            - name: netowl-data
              mountPath: /var/local/netowl-data
            - name: application-config
              mountPath: /var/local/netowl-data/license.key
              subPath: license.key


      volumes:
        - name: application-config
          configMap:
            name: responder-config
        - name: netowl-data
          emptyDir: {}
Servicio
apiVersion: v1
kind: Service
metadata:
  name: verification-of-payee-responder-application
spec:
  selector:
    app: verification-of-payee-responder-application
  ports:
    - protocol: TCP
      port: 8081
      targetPort: 8081
      name: server-port

Tenga en cuenta los siguientes aspectos clave:

  • Servicios de infraestructura como Kafka y MongoDB no se han proporcionado en la configuración anterior y no suministrados por Icon Soluciones.

  • El NetOwl la imagen anterior es un contenedor de terceros no suministrado por Icon Las soluciones y actualmente está siendo utilizadas por el Servicio de Resolución de Identidad, que se está ejecutando embebido en el VoP Responder app. Para más detalles sobre esto, por favor revise el Resolución de Identidad documentación. Si ya existe una instancia separada en el customer entorno, cualquier customisations debe ser reaplicado aquí si se utiliza una nueva imagen.

  • El VoP La aplicación Responder es creada por Icon Soluciones y alojadas en nuestro ipf-lanzamientos repositorio en Nexus.

  • El número de réplicas se ha establecido en 3 por razones de balanceo de carga.

  • Se han configurado las sondas de Liveness, Readiness y Startup para apoyar la estabilidad de nodos y pods, pero estas pueden ser modificadas si es necesario.

  • La anti-afinidad de pods ha sido configurada para distribuir los pods a través de múltiples nodos para prevenir un único punto de falla.

Ajuste de Rendimiento

Errores al Llamar a Servicios Externos

Puede encontrar errores si hay un alto número de VoP solicitudes que resultan en un número correspondiente alto de HTTP solicitudes que se están realizando a la VoP servicios aguas abajo. Esto también puede ocurrir si los servicios aguas abajo son simplemente lentos para responder a las solicitudes, causando un retraso en las solicitudes.

Akka HTTP

--HTTP Connector Transport usos Akka HTTP, las solicitudes utilizan las conexiones disponibles de la Akka HTTP pool de conexiones para realizar un nativo HTTP solicitud.

Akka HTTP - Desbordamiento de la piscina y la configuración de max-open-requests la página explica las posibles causas con más detalle y sugiere ajustar el Akka HTTP configúrelo como se muestra a continuación.

akka.http.host-connection-pool.max-connections = 64
akka.http.host-connection-pool.max-open-requests = 512

Los valores predeterminados se pueden encontrar aquí:https://doc.akka.io/libraries/akka-http/current/client-side/configuration.html[Akka HTTP - Configuración Predeterminada del Grupo de Clientes]

Los números utilizados son solo para referencia y no son cifras recomendadas. La cifra real debe ser determinada en función de pruebas realizadas en un entorno realista donde usted observó originalmente que ocurrían los errores.

Errores de Inicio

VoPResponder requiere una conexión a la base de datos durante el inicio de la aplicación, independientemente del tipo de registro de mensajes configurado, debido a Licenciamiento de IPF. Si la aplicación no puede conectarse a la base de datos durante el inicio, se marcará como no saludable. Continuará intentando reconectarse, y una vez que se establezca una conexión con éxito, la aplicación pasará a un estado saludable. Todos los fallos de conexión y los intentos de reintento se registrarán en el registro de la aplicación en el WARN nivel.

Cuando kafka se selecciona como el tipo de registro de mensajes, la aplicación también intentará conectarse a Kafka al iniciar. Sin embargo, la falta de conexión a Kafka se registrará pero no afectará el estado de salud de la aplicación por defecto. Esto es para evitar que el registro de mensajes se detenga. VoP solicitudes en proceso.

Si se considera crítico el registro de mensajes y Kafka los problemas de conectividad deben afectar la salud y la funcionalidad principal de la aplicación, puede habilitar este comportamiento configurando:

message.logger.send-connector.resiliency-settings.enabled = true

Si la base de datos se vuelve inaccesible después de la VoP Responder ha comenzado, luego el VoP El servicio de Responder dejará de estar disponible.