一、JMS
1:先了解什么是JMS:JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。2:JMS消息通常有两种类型:
A: 点对点(Point-to-Point)。在点对点的消息系统中,消息分发给一个单独的使用者。点对点消息往往与队列(javax.jms.Queue)相关联。B:发布/订阅(Publish/Subscribe)。发布/订阅消息系统支持一个事件驱动模型,消息生产者和消费者都参与消息的传递。生产者发布事件,而使用者订阅感兴趣的事件,并使用事件。该类型消息一般与特定的主题(javax.jms.Topic)关联。二、开源消息中间件(ActiveMQ,Kafka)
1、ActiveMQA:完全支持JMS规范,号称最受欢迎,最为强大的消息中间件,尽管某些方面实际并不强大。。。B:支持多种语言客户端:Java, C, C++, C#, Ruby, Perl, Python, PHPC:支持消息集群,虚拟目的地,通配符,组合目的地等高级特性。D:支持SpringE:支持协议可插拔: in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transportsF:支持使用JDBC进行快速持久化(使用mysql实际也不快,支持约500次写入/每秒)G:支持CXF,Axis,AjaxH:消费者消费消息通过服务端推送方式进行,offeset由服务端维持2、KafkaA:它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。B:支持多种语言客户端:Java,Python,C,C++,.net,Ruby,Perl,PHP,Clojure,Go,Node.js等等C:支持服务端和消费者集群;offset由消费者维护,可以通过控制offset控制对以前消息的消费;消息存储在磁盘,顺序读写,可以设置过期时间D:支持分区,可以设置复制因子进行容灾,kafka自身主从复制机制可确保高可用E:用户可自行实现分区路由规则,确保同类消息只落在某一个分区。F:通过消费者集群设置可实现队列模式和发布-订阅模式,这种设计也便于灵活扩展和容灾G:传统消息中间件在多消费者模型中无法很好的保证消费的顺序性,但kafka可以通过分区保证H:kafka具有高吞吐,高可用,低延时的特性,7200r/s的磁盘可写100M/sI:适用场景:页面浏览实时数据采集,实时监控,日志收集等J:Offset可存储在zk或者kafka,如果网络异常有出现重复消费的可能性,需要开发者自行保证幂等性K:kafka可以通过ACK确保不丢消息,但可能会带来消息的重复发送问题L:kafka通过批量消息处理,零拷贝,端到端批量压缩等技术来提升效率M:有较为健全的监控机制,可通过KafkaOffsetMonitor或者KafkaWebConsole监控。也可以通过JMX自定义进行自动监控。