Puntos de conocimiento de ActiveMQ (para revisión, para ser resueltos)

Papel

1, 异步化提升整体系统的吞吐能力asíncrono: ;
2, de desacoplamiento: 新模块接入时,可以做到最小代码的改动;
3, 设置流量缓冲池,让后端系统按照自身吞吐能力消费,不被冲垮de recorte: ;

Poner en cola dos métodos de consumo:

1, el modo de bloqueo síncrona (el recibir ()): 接收者调用MessageConsumer的receive()方式接收消息,receive在接收到消息之前将一直阻塞;
2, no bloqueante modo asíncrono (la 接受者调用MessageConsumer的setMessageListenerz注册一个消息监听器, 当消息到达后,系统自动调用监听器MessageLister的onMessage()方法onMessage): ;

1. Produzca primero un mensaje y solo comience el consumidor número uno.
Pregunta: ¿Puede el consumidor número uno consumir el mensaje?
si
2. Produzca primero un mensaje, primero comience el consumidor 1 y luego comience el consumidor 2,
pregunta: ¿puede el consumidor 2 consumir el mensaje?
El Consumidor No. 1 puede consumir, el Consumidor No. 2 no puede.
3. Comience primero con 2 consumidores y luego produzca 6 mensajes
Pregunta: ¿Cuál es la situación de consumo?
La mitad de una persona

Tema (publicar y suscribirse):

1 、生产者将消息发送到topic中,每个消息可以有多个消费者
2 、生产者和消费者之间有时间上的相关性,订阅某一个topic的消费者只能消费订阅后发布的消息;
3 、生产者生产时,topic不保存消息,假如无消费者就去生产,那就是一条废消息,一般先启动消费者再启动生产者;

cola de modo y de cola de las colas de tema modelo
1, el modo de funcionamiento:
queue是负载均衡模式,如果当前没有消费者,消息也不会丢失,如果有多个消费者,一条消息也只会发送给其中一个消费者;
topic是订阅发布模式,如果当前没有消费者,消息会丢失,如果有多个订阅者,订阅者都会接收到消息;
2, la presencia o ausencia del Estado:
queue数据默认在MQ服务器上默认是文件形式保存,也可配置成DB存储;
topic是无状态的;
3, integridad de la transmisión:
queue消息不会丢弃;
topic如果没有消费者,消息会被丢弃;
4, obteniendo el mensaje por:
queue是pull模式,消费者先发送个请求给broker是否有消息,有消息拉取消息;
topic是push,不需要消费者询问,broker会主动把消息发送给订阅者;

Modo pull y modo push

a. de punto a punto 如果没有消费者在监听队列,消息将保留在队列中,直至消息消费者连接到队列为止mensaje .
这种消息传递模型是传统意义上的懒模型或轮询模型.
在此模型中,消息不是自动推动给消息消费者的,而是要由消息消费者从队列中请求获得(拉模式).

b. El modelo de publicación / sub-mensajería es un modelo push. 在该模型中,消息会自动广播,消息消费者无须通过主动请求或轮询主题的方法来获得新的消息.

Tipo de mensaje de ActiveMQ

1, texto TextMessage 携带一个java.lang.String作为有效数据(负载)的消息,可用于字符串类型的信息交换mensaje: ;
2, objeto ObjectMessage 携带一个可以序列化的Java对象作为有效负载的消息,可用于Java对象类型的信息交换mensaje: ;
. 3, una asignación de MapMessage 携带一组键值对的数据作为有效负载的消息,有效数据值必须是Java原始数据类型(或者它们的包装类)及Stringmensaje: .
即:byte , short , int , long , float , double , char , boolean , String
4, byte BytesMessage 携带一组原始数据类型的字节流作为有效负载的消息mensaje: ;
5, secuencia de mensajes. 携带一个原始数据类型流作为有效负载的消息,它保持了写入流时的数据类型,写入什么类型,则读取也需要是相同的类型StreamMessage: ;

Resistencia:

Persistencia de cola: messageProdecer.setDeliveryMode (DeliveryMode.Persistent), el valor predeterminado es persistencia.

Transacción local: la transacción de transacción es parcial para el productor y el acuse de recibo es parcial para el consumidor
Falso: mientras se ejecuta el envío, el mensaje ingresa en la cola. Para cerrar la transacción, la configuración del segundo reconocimiento de parámetros debe ser válida.
verdadero: ejecutar enviar y luego confirmar antes de que el mensaje se envíe a la cola. Los mensajes deben enviarse en lotes y se requiere el procesamiento del búfer.
Los mensajes transaccionales se confirmarán automáticamente sin importar qué modo de confirmación de mensaje esté configurado.

Nota: Productor -> corredor y corredor -> consumidores son completamente dos operaciones. ¡
Sus transacciones y reconocimiento no están relacionados en absoluto, porque sus sesiones de productor y consumidor no están relacionadas en absoluto!

La transacción del productor es garantizar que el lote se envíe al intermediario, ya sea con éxito o fallando juntos.
La transacción del consumidor asegura que el mensaje enviado por brokee llegue al consumidor. .

Mecanismo de reenvío de mensaje de transacción:

La situación de volver a entregar el mensaje:
1. El consumidor usa una transacción y se llama a rollback () en la sesión;
2. El consumidor usa una transacción y se cierra antes de llamar a commit;
3. El consumidor se llama en la sesión en modo client_acknowledge recovery ();
4, cuando el consumidor consume el mensaje, el mensaje se transfiere automáticamente a otros consumidores.
El número predeterminado de retransmisiones es 6 y el intervalo de retransmisión es de 1 segundo;

reconocer el mecanismo de confirmación del mensaje:

El consumo exitoso de un mensaje se divide en tres etapas:
1. El consumidor recibe el mensaje del agente; 2. El consumidor procesa el mensaje; 3. El consumidor confirma al agente que el mensaje ha sido consumido.
Existen tres estrategias:
1. El cierre de sesión automático predeterminado (Session.auto_acknowledge): el consumidor regresa con éxito del método messageListener.onMessage, la sesión confirma automáticamente el mensaje y el intermediario lo elimina.
2. Firma manual (Session.client_acknowledge): el consumidor debe llamar manualmente al método message.acknowledge () para confirmar el mensaje, y el agente lo eliminará.
3. Permitir mensajes duplicados (Session.dups_ok_acknowledge): no es necesario confirmar, el mensaje puede enviarse repetidamente.

Protocolo de transmisión:

El valor predeterminado es el protocolo TCP y el puerto predeterminado para tcp es 61616.
Se recomienda utilizar el protocolo NIO, que se expande y optimiza según el protocolo Tcp y tiene una mejor escalabilidad.
Modificación de la configuración: el atributo de nombre del nodo transportConnector bajo el nodo transportConnetors del archivo activemq.xml en el directorio conf se cambia a auto + nio, y el atributo uri se cambia a auto + nio.

Permanencia:

1. El valor predeterminado es kahaDB: basado en archivos de registro. Configure el directorio del archivo de registro en el nodo persistenceAdapter. (El valor predeterminado es $ {activemq} / data / kahadb /)
2. jdbc: basado en una base de datos de terceros, como mysql, en el nodo persistenceAdapter, cambie a la configuración jdbc y configure DataSource.
3.levelDB

El almacenamiento de Kahadb utiliza un registro de transacciones más un archivo de índice para almacenar todas sus direcciones.
db-1.log, db.data, db.free, db.redo, lock
db-num.log: almacena datos en un tamaño de archivo predefinido, 32M por archivo predeterminado, un nuevo archivo cuando el archivo de datos está lleno Se creará en consecuencia. Cuando no haya más datos referenciados por el índice en el archivo, el archivo se eliminará.
db.data: el archivo de índice del mensaje, use BTree como índice para señalar el mensaje almacenado en db-num.log.
db.redo: usado para la recuperación de mensajes, si el mensaje kahaDb se almacena y se inicia después de una salida forzada, se usa para restaurar el índice BTree.
bloqueo: el archivo de bloqueo indica un bloqueo, lo que indica un agente que tiene permisos de lectura y escritura para el kahadb actual.

modo de almacenamiento jdbc:

Hay tres tablas:
1. activemq_msgs: una tabla utilizada para almacenar mensajes,
2. activemq_acks: una relación de suscripción de almacenamiento,
3. activemq_lock: utilizado en un entorno de clúster, solo puede haber un intermediario maestro a la vez;

Si se trata de una cola, el mensaje se almacenará en la tabla activemq_msgs sin consumidores. Mientras cualquier consumidor lo haya consumido, estos mensajes se borrarán después del consumo.
Si se trata de un tema, las suscripciones ordinarias no persistirán en los mensajes. Las suscripciones persistentes deben iniciar el productor antes de producir el mensaje. Posteriormente, independientemente de si el suscriptor está en línea, el mensaje eventualmente se recibirá.
De lo contrario, todos los mensajes no recibidos serán recibidos y procesados ​​cuando se conecte nuevamente.

Notas de desarrollo:

  1. Coloque el paquete jar de la base de datos en el directorio activemq lib;
  2. El atributo createTableOnStartup se elimina una vez que se completa el inicio o se cambia a falso;
  3. La codificación de la base de datos usa formato latino;

Puede usar jdbc con el modo diario, utilizando la tecnología de escritura en caché, que mejora enormemente el rendimiento, primero escriba el archivo de diario y luego escriba en la base de datos.

Alta disponibilidad:

¿Cómo garantizar una alta disponibilidad después de introducir la cola de mensajes?
Clúster maestro-esclavo usando zookeeper + replicated-leveldb-store. Es un clúster activeMQ basado en zookeeper y levelDB.
El clúster proporciona una función de clúster de alta disponibilidad en los modos principal y en espera para evitar puntos únicos de falla.
Principio: utilice el clúster zookeeper para registrar todos los ActiveMq, pero solo uno de los corredores puede proporcionar servicios se considera maestro, los
otros corredores están en estado de espera, se consideran esclavos. Si el maestro no puede proporcionar servicios, el cuidador del zoológico elegirá un esclavo para que actúe como maestro, el
esclavo se conecta al maestro y sincroniza su estado de almacenamiento, y el esclavo no acepta la solicitud del cliente.

Entrega asincrónica:

Para los consumidores lentos, el envío de mensajes sincrónicamente puede causar el bloqueo del productor, y los consumidores lentos son adecuados para la entrega asincrónica.
ActiveMQ utiliza el modo de envío asíncrono de forma predeterminada. A menos que especifique explícitamente el envío sincrónico o envíe mensajes persistentes sin usar transacciones, los dos casos son sincrónicos.
Escenario de uso: permita una pequeña cantidad de pérdida de datos en caso de falla y envíe mensajes en un caso relativamente denso.
Configuración:
1, conexión uri
2, conexión Fábrica
3, conexión

¿Cómo determinar el éxito del mensaje asincrónico?
El método de envío asíncrono necesita recibir la devolución de llamada.

La diferencia entre transmisión síncrona y asíncrona.
Si el envío no está bloqueado, como el envío síncrono, significa que el envío debe ser exitoso. Para el
envío asíncrono, la devolución de llamada debe recibirse y el cliente determina si el envío es exitoso nuevamente.

Entrega retrasada:

Activemq.xml necesidades de nodo intermediario para ser configurados en el directorio de archivos activemq conf schedulersupport = true;
Hay cuatro parámetros:
amq_scheduler_delay: entrega de retardo de tiempo;
amq_scheduler_period: intervalo de repetición;
amq_scheduler_repeat; número de repeticiones de entrega;
amq_scheduler_cron: Expresión de la cron Estilo

Cola de letra muerta:

mensaje de ACK venenosa
一个消息超过最大的重发次数(默认为6次)时,消费端会给broker发送“poison ack”,表示这个消息有毒,告诉broker不要再发了Poison: .
这个时候broker会把这个消息放到死信队列(dead letter queue).
将所有的deadletter保存在一个共享队列中,共享队列默认为ActiveMQ.DLQ.

¿Cómo asegurarse de que el mensaje no se consume repetidamente?

准备一个第三方服务来做消费记录,以redis为例,给消息分配一个全局id,只要消费过该消息,将<id,message>以k-v键值对形式存入redis, 那消费者在开始消费之前,先去redis查询有没有消费记录即可

Publicado 15 artículos originales · elogiado 0 · visitas 67

Supongo que te gusta

Origin blog.csdn.net/xrzi2015/article/details/105604123
Recomendado
Clasificación