Kimmking2013-6Agenda消息系统、协议与技术消息系统及其结构STOMP/JMS/AMQP/MQTTEIP与SEDA常见开源消息中间件ZeroMQFqueueActiveMQ与ApolloKafka与MetaQRabbitMQMQ选型与未来发展展望消息系统、协议与技术Messaging耦合-松耦合同步-异步化直接请求-缓冲压力A系统B系统OnewayA系统B系统RequestResponseA系统B系统sendA系统B系统MOMreceivesendMOMreceivereceivesendRPC部署结构A系统C系统D系统F系统B系统E系统Messaging部署结构F系统C系统MQQueueQueueQueueA系统D系统E系统B系统Messaging系统结构A系统B系统MQQueueExchangeStorageDispatch客户端应用层:发送和接收消息的API接口消息模型层:消息、连接、会话、事务等等消息处理层:消息交互逻辑定义、持久化网络传输层:序列化协议、传输协议、可靠机制安全层管理层MQ消息中间件特性系统的稳定性与健壮性Stability&Robustness长期稳定运行高并发下运行消息的可靠性Reliability发送的可靠性接收的可靠性事务性本地事务分布式事务QoS&DLQMQ消息中间件特性性能PerformanceBroker性能基于内存队列基于内存+异步/同步持久化到磁盘基于内存+顺序/随机读写磁盘基于内存+持久化到关系数据库Client性能异步/同步发送、接收确认机制事务性会话消息积压memoryConsumerProducerDiskBrokerMQ消息中间件特性高可用性HACluster&Sharding负载均衡LoadBalance主从Master-Slave分片PartitionFailover自动手动Replication同步复制异步复制MasterSlaveSlaveSlaveReplicationReplicationReplicationMasterSlaveMasterMasterClientClientMQ消息中间件特性扩展性Scalability支持多种协议和规范支持多种接入和传输方式支持自定义消息策略支持自定义插件机制可管理性ManageabilityBroker与Queue的管理Client与Connection的管理Cluster与Sharding的管理JMX或REST方式的管理API接口JMS(Java消息服务)关注于应用层的API协议(类似JDBC)Message结构与Queue概念Body\Header\Property,messagestypesQueue\Topic\TemporaryQueue\TemporaryTopicConnection\Session\Producer\Consumer\DurableSubscriptionMessaging行为PTP&Pub-Sub持久化事务机制确认机制临时队列Spring-JMSJMSTemplate提供了便利的发送方法,不用再关注异常和资源释放。CachingConnectionFactory提供了从生产者/消费者到Session,再到Connection的Cache策略,这些资源都能被重复使用。提供了Message与Objec的转换方式。STOMP(简单文本消息协议)Simple(orStreaming)TextOrientatedMessagingProtocol简单、基于Frame、文本的命令式操作协议类似HTTP/SMTP/FTP等协议易用、跨平台、MQ无关性shell下使用telnet或nc命令与MQ交互STMOP操作演示性能较低ActiveMQ的STOMP支持协议封装与转换AdvancedMessageQueuingProtocol来自于JPMorgan,源于满足金融系统的消息通讯业务需求:线路级协议、实现客户端与不同MQ间的互操作五个基本部分:数据类型与编码消息传输交互消息定义与行为事务安全性MQTTMQTelemetryTransportMQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议。基于TCP的简单二进制通讯协议。协议各部分的定义精确到bit,最小消息为2bytes。不同于一般MQ的长连接,协议规定了keepalivetimer参数和ping指令。QoSlevel决定了交互次数。为物联网(InternetOfThings)准备的消息协议。EIP与SEDAEnterpriseIntegrationPatternsStagedEvent-DrivenArchitecture~mdw/proj/seda/常见开源消息中间件ZeroMQ项目地址基于C++开发,性能非常高的内存MQ内核本身就是一个并发框架做的socket库在集群环境下比TCP更快支持各种常见平台,但是需要额外的绑定包装基本不支持持久化任何程序都可以变成MQbroker(zerobrokers)各种语言的例子官方文档:allFqueue(FastQueue)支持memcached协议(分布式和高可用机制)基于磁盘持久化存储(顺序处理的日志文件)高性能(20-30万写入QPS)、低内存使用配置和使用简单项目地址高可靠的、事务性的消息队列当前应用最广泛的开源消息中间件项目开始与2005年CodeHaus2006年成为Apache项目Java代码44万行,xml代码3.9万行(5.7.0)24个Committers核心人员均为商业公司FuseSource职员支持多种接入协议和消息协议Java和C++客户端支持无缝地failoverActiveMQ-Failover与Reconnect状态复制PureMaster-Slave基于共享锁JDBCMaster-Slave(表的排它锁)SharedFileSystemMaster-Slave(文件的写锁)ActiveMQ-HighAvailability不共享存储全复制(所有消息、所有应答、所有事务)从服务器(备份服务器)默认不启动对外服务组件,只同步备份主服务器的所有数据。可配置从服务器在主服务器挂机后启动服务充当主服务器。PureMaster-Slave可靠性好,但性能一般。推荐使用如果原系统已经存在企业数据库。从服务器个数没有限制。配置简单。从服务器一直待机状态,除非竞争到DB锁JDBCMaster-Slave推荐使用如果现存SAN从服务器(Slave)个数无限制配置简单注意确认文件锁是否正常及超时时间,NFSv4SharedStorageMaster-SlaveSecuritySecurechannels(SSL)Authentication•Filebased•JAASplugin(Certificates,LDAP)Authorization•DestinationLevel•MessageLevelApolloApacheActiveMQ的改进版本,使用Scala开发主要特点:ReactorBasedThreadModel基于hawtdispatch(threadpooling/NIOeventframework)Scala2.9ImplementationProtocolAgnostic(不支持JMS)STOMP、AMQP、MQTT、OpenWireRESTBasedManagementMessageSwapping压缩内存消息,交互到磁盘Kafka与MetaQKafka(基于Scala)O(1)、顺序读写的持久化,高吞吐量是主要设计目标producer、broker、consumer都是分布式的PartitionMessages基于ZooKeeper,轻量级brokerPull,消费记录在Consumer端Consumer分组支持并行加载数据到Hadoop异步复制和异步复制MetaQ(Java重新实现并改进)支持本地和分布式事务文本的监控协议设计RabbitMQ基于Erlang开发持久化方式为异步flush到磁盘工具和插件丰富RabbitMQ-HAactive/passivepairofnodesMaster-Slave的Queue镜像复制使用场景与选型事务可靠性场景(ActiveMQ)重要业务数据的异步处理数据的增量远程同步吞吐量优先场景(MetaQ)一般性的通知日志的传输和收集系统性设计场景系统间RPC依赖解耦和耗时同步操作转异步应用开源MQ最大的挑战是可管理性方面的问题消息中间件的未来可扩展性Scalability大规模弹性的MQcluster网络更可靠高效的replication与failover更细粒度和透明的sharding可管理性Manageability监控流控…更细粒度的专用性MQ与其他技术领域更紧密的衔接与融合Q&AAnyQuestion?Thanks!