1.RabbitMQ—消息队列选型

来源:互联网 发布:mac pro删除桌面图标 编辑:程序博客网 时间:2024/06/06 14:17

项目背景

在高并发环境下,由于来不及同步处理,请求往往会发生堵塞(主要原因),比如说,大量的insert,update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。

项目需求

合规化理财项目改造过程中,决定使用消息队列达到业务解耦,调查后其特点有:业务消息体积小、对消息队列做业务场景依赖度高、事件需要ack机制、对队列要求效率快

技术选型调查

  1. RabbitMQ:是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。是AMQP协议领先的一个实现,它实现了代理(Broker)架构,意味着消息在发送到客户端之前可以在中央节点上排队。对路由(Routing),负载均衡(Load balance)或者数据持久化都有很好的支持。此特性使得RabbitMQ易于使用和部署,适宜于很多场景如路由、负载均衡或消息持久化等,用消息队列只需几行代码即可搞定。但是,这使得它的可扩展性差,速度较慢,因为中央节点增加了延迟,消息封装后也比较大。如需配置RabbitMQ则需要在目标机器上安装Erlang环境。
  2. ZeroMQ:号称最快的消息队列系统,尤其针对大吞吐量的需求场景。是一个非常轻量级的消息系统,专门为高吞吐量/低延迟的场景开发,在金融界的应用中经常可以发现它。与RabbitMQ相比,ZeroMQ支持许多高级消息场景,但是你必须实现ZeroMQ框架中的各个块(比如Socket或Device等)。且其仅提供非持久性的队列,也就是说如果down机,数据将会丢失。
  3. MSMQ:这是微软的产品里唯一被认为有价值的东西。如果MSMQ能证明可以应对这种任务,他们将选择使用它。关键是这个东西并不复杂,除了接收和发送,没有别的;它有一些硬性限制,比如最大消息体积是4MB。然而,通过和一些像MassTransit 或 NServiceBus这样的软件的连接,它完全可以解决这些问题。但是有平台局限性。
  4. Jafka/Kafka:kafka(能将消息分散到不同的节点上)是LinkedIn于2010年12月开发并开源的一个分布式MQ系统,现在是Apache的一个孵化项目,是一个高性能跨语言分布式Publish/Subscribe消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。具有以下特性:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现复杂均衡;支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka通过Hadoop的并行加载机制来统一了在线和离线的消息处理,这一点也是本课题所研究系统所看重的。Apache Kafka相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。适合做数据日志分类统计等。Kafka 自身服务和消费者都需要依赖 Zookeeper。
  5. Apache ActiveMQ:ActiveMQ居于两者(RabbitMQ & ZeroMQ)之间,类似于ZemoMQ,它可以部署于代理模式和P2P模式。类似于RabbitMQ,它易于实现高级场景,而且只需付出低消耗。ActiveMQ被誉为Java世界的中坚力量。它有很长的历史,而且被广泛的使用。它还是跨平台的,给那些非微软平台的产品提供了一个天然的集成接入点。然而,它只有跑过了MSMQ才有可能被考虑。如需配置ActiveMQ则需要在目标机器上安装Java环境。据说其数据存在丢失等问题,因此apache出了下一代产品apollo,市场技术不够成熟。
  6. Redis:是一个Key-Value的NoSQL数据库,开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。但是redis不支持ack机制。
  7. RocketMQ:是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。

技术选型对比

这里写图片描述 

技术选型最终确定

rabbitMQ支持的开发语言:http://www.rabbitmq.com/devtools.html

RabbitMQ是一个AMQP实现,传统的messaging queue系统实现,基于Erlang。老牌MQ产品了。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量还在其次。Spring官网介绍中,对结合MQ场景也是推荐使用RabbitMQ,其对springboot结合也有介绍。基于以下几点,建议使用RabbitMQ:

  1. 数据稳定可靠、数据可恢复性、ack机制
  2. 对Spring的整合比较容易,将来微服务的架构也易于整合
  3. 在集群、负载均衡方面,运维设施维护方便

  1. 市场技术成熟,文档齐全 (中文学习文档:http://rabbitmq.mr-ping.com/,源码文档:http://www.rabbitmq.com/releases/rabbitmq-java-client/current-javadoc/)
  2. 参考博客文档地址:http://blog.csdn.net/azhegps/article/details/53815038

0 0
原创粉丝点击