详谈ActiveMQ消息中间件

1.什么是ActiveMQ?

activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、 可扩展的、稳定的和安全的企业级消息通信 。
ActiveMq消息队列,他主要的作用就是,解耦,方便维护。

就比如,我商家运营商后台可能依赖了4个服务,可能有solr,redis,广告服务,页面生成服务。 但是用了mq将其整合在一起
后,那么就可以只和一个mq去耦合。

Mq的特点,支持多种传输协议。(比如TCP,UDP)
也支持多种语言(php,c++,c#,java,python)


2.ActiveMq怎么发送消息的?

可以以两种方式发布消息,一种是点对点的方式,一种是发布订阅的方式,发布订阅的方式用的比较多。

ActiveMq消息发送失败的话会怎么样?
如果点对点的方式去发布消息的话,如果消息发送不成功此消息会默认保存到activeMq服务端直到有消费者去消费,所以说消息不会丢失。

如果是发布订阅的方式。默认情况下只通知一次,如果接受不到消息,此消息就丢失了。若是要求消息传达并且不可以丢失的话,需要配置持久订阅。


3. 丢消息怎么办?

1.用持久化消息,ActiveMQ 的持久化机制有 JDBC、AMQ(了解)、KahaDB和LevelDB,无论哪种持久化方式,消息存储逻辑都是一致的。
当消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等再试图将消息发送给接受者,成功则将消息从存储中删除,失败则继续尝试发送。

2.或者使用非持久化消息及时处理不要堆积。

3.启动事务,启动事务后,commit() 方法会负责任的等待服务器的返回,也就不会关闭连接导致消息丢失了。


4.如何防止消息重复发送?

解决方法:增加消息状态表。

通俗来说就是一个账本,用来记录消息的处理状态。
每次处理消息之前,都去状态表中查询一次。
如果已经有相同的消息存在,那么不处理,可以防止重复发送。


5. 持久化消息非常慢。

默认的情况下,
非持久化的消息是异步发送的。
持久化的消息是同步发送的。

遇到慢一点的硬盘,发送消 息的速度是无法忍受的。

但是在开启事务的情况下,消息都是异步发送的,效率会有2个数量级的提升。
所以在发送持久化消息时,请务必开启事务模式
其实发送非持久化消息时也建议开启事务,因为根本不 会影响性能。


6. 消息的不均匀消费

有时在发送一些消息之后,开启2个消费者去处理消息。
会发现一个消费者处理了所有的消息,另一个消 费者根本没收到消息。
原因在于ActiveMQ的prefetch机制
当消费者去获取消息时,不会一条一条去 获取,而是一次性获取一批,默认是1000条。
这些预获取的消息,在还没确认消费之前,在管理控制台 还是可以看见这些消息的,但是不会再分配给其他消费者。
此时这些消息的状态应该算作“已分配未消费”, 如果消息最后被消费,则会在服务器端被删除,如果消费者崩溃,则这些消息会被重新分配给新的消费者。
但是如果消费者既不消费确认,又不崩溃,那这些消息就永远躺在消费者的缓存区里无法处理。
更通常的 情况是,消费这些消息非常耗时,你开了10个消费者去处理,结果发现只有一台机器吭哧吭哧处理,另 外9台啥事不干。

解决方案:将prefetch设为1,每次处理1条消息,处理完再去取,这样也慢不了多少


7. Queue和Topic的区别

点对点(point-to-point,简称PTP)Queue消息传递模型。能够保证数据安全

发布/订阅(publish/subscribe,简称pub/sub)Topic消息传递模型。可能造成数据丢失


8. ActiveMQ服务器宕机怎么办?

这得从ActiveMQ的储存机制说起。
在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存 储在文件中的,它们的最大限制在配置文件的节点中配置。
但是,在非持久化消息堆积 到一定程度,内存告急的时候,ActiveMQ会将内存中的非持久化消息写入临时文件中,以腾出内存。
虽 然都保存到了文件里,但它和持久化消息的区别是,重启后持久化消息会从文件中恢复,非持久化的临时 文件会直接删除。

那如果文件增大到达了配置中的最大限制的时候会发生什么?我做了以下实验:

设置2G左右的持久化文件限制,大量生产持久化消息直到文件达到最大限制,此时生产者阻塞,但消费 者可正常连接并消费消息,等消息消费掉一部分,文件删除又腾出空间之后,生产者又可继续发送消息, 服务自动恢复正常。

设置2G左右的临时文件限制,大量生产非持久化消息并写入临时文件,在达到最大限制时,生产者阻塞, 消费者可正常连接但不能消费消息,或者原本慢速消费的消费者,消费突然停止。整个系统可连接,但是 无法提供服务,就这样挂了。

具体原因不详,解决方案:尽量不要用非持久化消息,非要用的话,将临时文件限制尽可能的调大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值