1.ActiveMQ消息传送机制:
名词 | 解释 |
---|---|
Producer | 客户端使用来发送消息的 |
Consumer | 客户端用来消费消息 |
ActiveMQ broker | 协同中心 |
broker | 让producer和consumer调用过程解耦的工具,最终实现了异步RPC/数据交换的功能 |
例子 | 一条消息从producer端发出之后,一旦被broker正确保存,那么它将会被consumer消费,然后ACK,broker端才会删除;不过当消息过期或者存储设备溢出时,也会终结它。随着ActiveMQ的不断发展,支持了越来越多的特性,也解决开发者在各种场景下使用ActiveMQ的需求。比如producer支持异步调用;使用flow control机制让broker协同consumer的消费速率;consumer端可以使用prefetchACK来最大化消息消费的速率;提供"重发策略"等来提高消息的安全性等 |
2)消息通信的方式:
方式 | 概述 |
---|---|
同步 | 发送者发送一条消息会阻塞 直到broker反馈一个确认消息给发送者,表示消息已经被broker处理。 待发送消息得到接收程序的返回消息之后会继续向下运行,进行下一步的业务处理。消息的安全性保障,由于是阻塞的操作,会影响到客户端消息发送的性能 |
异步 | 发送者不需要等待broker提供反馈给发送者,性能相对较高。但是可能会出现消息丢失的情况。所以使用异步发送的前提是在某些情况下允许出现数据丢失的情况 |
选择策略 | 1.非持久化的消息都是异步发送的。 2.持久化消息在非事务模式下是同步发送的。 3.在开启事务的情况下,消息都是异步发送 |
由于异步发送的效率会比同步发送性能更高,在发送持久化消息的时候,尽量去开启事务会话,或者设置使用异步发送。以上三种默认策略,除了默认设置,我们可以认为设置发送模式。总结如下三种方式:
3)JMS消息类型:
点对点(point-to-point)
Queue消息传递模型:在该消息传递模型下,一个消息生产者向消息服务器端一个特定的队列发送消息,一个消费者从该队列中读取消息。这种模型的特点为:能够保证数据安全;
发布/订阅(publish/subscribe)
Topic消息传递模型:在该消息传递模型下,一个消息发布者向一个特定的消息主题发布消息,0或多个对此消息主题感兴趣的并且处于活动状态的消息订阅者或者建立了持久订阅的消息订阅者才可以接收到所发布的消息。
数据容易丢失;
4)activeMQ默认配置下启动会启动8161和61616两个端口,其中8161是mq自带的管理后台的端口,61616是mq服务默认端口
5)ActiveMQ服务器宕机怎么办?
在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中,它们的最大限制在配置文件的节点中配置。但是,在非持久化消息堆积到一定程度,内存告急的时候,ActiveMQ会将内存中的非持久化消息写入临时文件中,以腾出内存。
解决方案:尽量不要用非持久化消息,非要用的话,将临时文件限制尽可能的调大。
6)丢消息怎么办?
这些发送的数据都在接收者的缓存里,接收者如果调用read方法仍旧能从缓存中读取这些数据,尽管对方已经关闭了连接。ActiveMQ会每隔10秒发送一个心跳包,这个心跳包是服务器发送给客户端的,用来判断客户端死没死。
解决方案:用持久化消息,或者非持久化消息及时处理不要堆积,或者启动事务,启动事务后,commit()方法会负责任的等待服务器的返回,也就不会关闭连接导致消息丢失了。
7)消息的不均匀消费?
当消费者去获取消息时,不会一条一条去获取,而是一次性获取一批,默认是1000条。这些预获取的消息,在还没确认消费之前,在管理控制台还是可以看见这些消息的,但是不会再分配给其他消费者,此时这些消息的状态算作“已分配未消费”,如果消息最后被消费,则会在服务器端被删除,如果消费者崩溃,则这些消息会被重新分配给新的消费者。但是如果消费者既不消费确认,又不崩溃,那这些消息就永远躺在消费者的缓存区里无法处理。
解决方案:将prefetch设为1,每次处理1条消息,处理完再去取,这样也慢不了多少。
8)死信队列
如果你想在消息处理失败后,不被服务器删除,还能被其他消费者处理或重试,可以关闭AUTO_ACKNOWLEDGE,将ack交由程序自己处理。