技术编程开源 VS 商业,消息中间件你不知道的那些事( 三 )


RocketMQ不支持消息死信机制 。
Apollo只支持消息过期模式 , 可设置redelivered参数 , 当超过maximumRedeliveries(缺省为6次)次数时 , 消息会放入死信队列 。
基本功能——消息有效期:主要通过在JMS客户端设置消息生存时间 , 在生存时间结束后启动消费者 , 消息是否被丢弃或销毁 。
除RocketMQ之外的产品均支持消息有效期配置 。
RabbiMQ消息有效期最长保留时间为2^32-1毫秒 。
RocketMQ支持队列有效期设置 , 当磁盘空间不够时会删除创建时间最久的持久化文件 。
基本功能——消息优先级:主要通过在JMS客户端发送一组消息 , 是否可配置消息的优先级 , 是否可按消息的优先级进行处理 。
IBM WMQ、Oracle JMS、ActiveMQ、Apollo均支持消息优先级和队列优先级配置 。
RabbitMQ、RocketMQ不支持消息优先级配置 , 只支持队列优先级配置 , 即配置一个优先级高的队列 , 和一个普通优先级的队列 , 将优先级不同的消息发往不同队列进行处理 。
运维管理专题分析
总体来看 , 各产品在运维管理模块实现都较为完善 , 没有明显短板 。
商业产品在管理工具和日志系统相对较为完善 。
RabbitMQ监控系统的功能实现更为丰富 。
运维管理——管理工具:在管理界面测试是否可以进行队列的创建、删除、启动等基本功能 。
商业产品在管理界面上支持较为完善 , 能通过管理界面进行队列的创建、删除及队列的启停等动作 。
开源产品在管理界面上只支持队列的创建、删除 , 不支持队列的启停等动作 。
IBM WMQ、Oracle有完善的配置文件、命令行、接口支持 。
RabbitMQ、RocketMQ管理界面不支持队列的启停 , 可通过命令行、接口实现 , 支持Rest API接口 。
ActvieMQ / Apollo管理界面除不支持队列的启停外 , 不支持集中化管理 , 通过JMX配置文件实现 , 支持Rest API接口 。
运维管理——日志系统:可以修改实例的日志级别 , 使其可以记录系统的重要事件 , 比如新的入站连接、新消息入站等 。
商业产品在日志系统上做得最为完善 , 日志配置也比较简单 。
开源产品在消息可见性、日志分割支持力度不够 。
RabbitMQ基于AMQP协议 , 不支持第三方Log4j的日志打印实现 。
RocketMQ不支持TRACE日志跟踪 。
运维管理——监控系统:可监控消息中间件运行状态 , 可监控到集群内所有节点队列数、队列中消息数、出入队消息数、连接数等 。
RabbitMQ在监控系统模块表现最为优秀 , 集群性能、队列性能、消息发送次数、持久化大小、TPS性能等均有丰富的实现 。
RocketMQ不支持队列内存占用和持久化大小的实现 。
IBM MQ、Oracle JMS不支持队列内存占用、持久化大小、TPS性能的实现 。
ActiveMQ / Apollo仅支持单个队列的控制台实现 , 但对单个队列的监控实现较为丰富 , 不支持TPS性能的实现 。
集群功能、事务支持、高可用、稳定性专题分析
除Apollo外各产品均能较好的实现集群所需功能 。
Apollo不支持集群功能(消息路由) , 能通过配置文件实现水平扩展 , 能通过failover协议实现负载均衡 。
RabbitMQ需通过第三方软件HAProxy来实现负载均衡 。
集群功能:通过配置集群实例 , 能实现队列的水平扩展、动态扩展 , 能实现消息的路由和负载均衡 。
除Apollo外各产品均能较好的实现集群所需功能 。
Apollo不支持集群功能(消息路由) , 能通过配置文件实现水平扩展 , 能通过failover协议实现负载均衡 。
RabbitMQ需通过第三方软件HAProxy来实现负载均衡 。
事务支持:通过应用程序测试是否支持本地事务的commit、rollback等机制 。
所有产品均能较好的实现本地事务支持功能 , 包括事务提交、事务回滚等 。