中间件-ActiveMQ

中间件之ActiveMQ整理总结

Posted by Kang on September 16, 2019

MQ作用

解耦、消峰填谷

MQ选择

  • 消息事务性(Active MQ、Rocket MQ)
  • 消息延时性(Active MQ、Rocket MQ)
  • 消息顺序性(Rocket MQ)
  • 消息持久化
  • 消息失败重试
  • 监控性
      其中,延时性是用在延时执行某个动作场景下,相比将执行动作落库后定时器处理,不需要单独定时任务扫描,提高了执行时效性,也不会出现对数据库造成压力。

MQ面试常见问题

持久化与非持久化

  对于持久化消息,若发生MQ宕机后,在其重启后能恢复;而对于非持久化消息,虽然当在内存中达到一定量时会转化为临时文件进行存储,但是重启服务器后临时文件会被删除。
  非持久化临时文件大小做限制,当数据量达到阈值时整个系统都是可连接但是无法服务状态。

保障消息不丢失

  消息丢失原因:

  • 生产者:生产者发送消息后再网络中丢失或者MQ接收到消息后,还没入盘发生宕机;
    • 解决方案:生产者开启confirm机制,MQ入盘后(高速盘)和同步子节点(异步?)后回复确认消息,或者在必要的情况下开启事务消息;
  • 消费者:在业务处理完后手动做ACK应答;

消费消息不均衡

  MQ存在prefetch机制,即在消费者消费消息时,可能批量的处理消息(默认1000条),这些消息被消费者批量拿走后为”已分配未消费”状态。所以解决方案是将prefetch设置为较低的值或者1;

集群搭建

  写在前面:目前使用的最佳方案是两种大的模式混合使用,在客户端根据规则先连接到具体的Cluster中,Cluster内部使用LevelDB模式进行管理。

共享文件模式&共享数据库模式

  所有Broker共享数据文件(FILE||DB),slave间歇性的尝试获取排它锁,获取到的Broker节点接管成为Master节点。

Replicated LevelDB Store(首选)

  这种模式下为Zookeeper管理+数据副本存储来构建。
  Master产生:Zookeeper管理了所有Broker,通过选举算法产生Master(优先选择数据最新的节点),一旦Master异常,Zookeeper通过内部选举算法产生新的阶段;
  对外服务及数据同步:Master才能提供对客户端的连接,当Master接收到数据时,需要将数据发送给一半Slave节点后,才能算成功并向Producer发送ACK确认消息。因为有实时同步数据的slave的存在,master不用担心数据丢失,所以leveldb会优先采用内存存储消息,异步同步到磁盘。所以该方式的activeMQ读写性能都最好,特别是写性能能够媲美非持久化消息。

缺点:
  1)、占用的节点数过多,1个zookeeper集群至少3个节点,1个activemq集群也至少得3个节点,但其实正常运行时,只有一个master节点在对外响应,换句话说,花6个节点的成本只为了保证1个master节点的高可用,太浪费资源了;
  2)、一个master无法支撑大的数据量,所以master需要水平扩展,做成负责均衡;

基于NetworkConnector的Broker Clusters模式

  Broker-Cluster的部署方式就可以解决负载均衡的问题。Broker-Cluster部署方式中,各个(Master)broker通过网络互相连接同步,也即共享了queue(中的消息),保证消息同步。当某个Broker挂掉后,客户端会自动连接别的broker。
推荐阅读

集群服务

failover失效转移

  在客户端配置failover,当一个集群Master节点失效时,客户端可以直接转移连接另一个节点。注意的是,客户端的failover需要将两个集群的Broker节点都配置上去;

集群之间数据共享与同步

  两个Cluster集群之间通过networkConnector进行数据同步。由于集群Master节点共享queue队列,消费端连接到任意一个集群时,若当前消息不存在,当前服务集群会去另一个集群中取消息。

集群负载均衡

  这个地方所说的负载均衡貌似只是消费端来说的,其可以到任何一个集群去消费,对于Producer来说,还是发送到指定集群。。。