1.ACE:
ACE提供了一组丰富的可重用C++包装外观(WrapperFacade)和框架组件,可跨多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步等等。ACE简化了使用进程间通信、事件多路分离、显式动态链接和并发的面向对象的网络应用和服务的开发。
ACE架构图如图1-1所示:
ACE的优点主要有:
(1).增强可移植性:在ACE组件的帮助下,很容易在一种OS平台上编写并发网络应用,然后快速地将它们移植到各种其他的OS平台上。
(2).更好的软件质量:ACE使用了许多可提高软件质量的关键设计模式,提供了通信软件灵活性、可扩展性、重用性和模块性。
(3).更高的效率和可预测性:ACE支持广泛的应用服务质量(QoS)需求,包括延迟敏感应用的低响应等待时间、高带宽应用的高性能,以及实时应用的可预测性。
(4).更容易转换到标准的高级中间件:TAO使用了ACE提供的可重用组件和模式,按照CORBA的标准实现,并且为高性能和实时系统作了优化。
(5).ACE包含一个高级的网络编程框架,集成并增强了较低层次的C++包装外观。该框架支持将并发分布式服务动态配置进应用。后者比前者更加底层,更加抽象。ACE可以认为是通用网络编程框架软件,而ICE则是一个跨平台的RPC软件。
ACE的缺点主要有:
(1).整个架构比较复杂,研究学习还是比较好的选择,但是使用比较复杂。
2.ICE:
ICE是一款高性能的中间件,支持分布式的部署管理,消息中间件,以及网格计算等等。主要结构如下图2-1所示:
ICE的优点主要有:
(1).面向对象的语义,所有的操作调用都使用迟后绑定。
(2).支持同步和异步的消息传递,提供了同步和异步的操作调用和分派,提供了发布——订阅消息传递机制。
(3).与硬件架构无关,客户端及服务器与底层的硬件架构屏蔽开来。对于应用代码而言,像字节序和填充这样的问题都隐藏了起来。
(4).与上层的编程语言无关,客户端和服务器可以分别部署,所用语言也可以不同,支持C++、Java语言,客户端支持PHP语言。
(5).与采用的操作系统无关,ICE完全是可移植的,同样的源码能够在Windows、Linux、MacOS和UNIX上编译和运行。
(6).完全是线程化的,其API是线程安全的。
(7).采用TCP、IP 和UDP作为传输协议,客户端和服务器代码都不需要了解底层的传输机制。
(8).服务器的位置是对用户透明的,ICE例程负责定位对象,并管理底层的传输机制,比如打开和关闭连接。客户与服务器之间的交互显得像是无连接的。服务器可以迁移到不同的物理地址,而不会使客户持有的代理失效,而客户完全不知道对象实现是怎样分布在多个服务器进程上的。
(9).采用SSL强加密,可以使客户和服务器完全安全地进行通信。
(10).采用内建的持久机制创建持久的对象。并且提供了对高性能数据库Berkeley DB的内建支持。
ICE的缺点主要有:
(1).整个架构比较复杂,研究学习还是比较好的选择,但是使用比较复杂。
3.Boost::ASIO:
Boost Asio ( asynchronous input and output)关注异步输入输出。BoostAsio库提供了平台无关性的异步数据处理能力(当然它也支持同步数据处理)。一般的数据传输过程需要通过函数的返回值来判断数据传输是否成功。Boost Asio将数据传输分为两个独立的步骤:
采用异步任务的方式开始 数据传输。将传输结果通知调用端。与传统方式相比,优点在于程序在数据传输期间不会阻塞。
Boost::ASIO架构图如下图3-1所示:
Boost::ASIO的优点:
(1). 与传统方式相比,优点在于程序在数据传输期间不会阻塞。
(2). 可扩展多线程。
(3). 可移植。
Boost::ASIO的缺点:
(1).抽象复杂。
(2).内存占用。
4.MSMQ:
MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。消息Message是由通信的双方所需要传递的信息。
MSMQ架构图如图4-1所示:
队列的类型主要包括一下几种:
(1).“公共队列”在整个“消息队列”网络中复制,并且有可能由网络连接的所有站点访问。
(2).“专用队列”不在整个网络中发布。相反,它们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。
(3).“管理队列”包含确认在给定“消息队列”网络中发送的消息回执的消息。指定希望 MessageQueue 组件使用的管理队列(如果有的话)。
(4).“响应队列”包含目标应用程序接收到消息时返回给发送应用程序的响应消息。指定希望 MessageQueue 组件使用的响应队列(如果有的话)。
优点:稳定、消息优先级、脱机能力以及安全性,有保障的消息传递和执行许多业务处理的可靠的防故障机制。
缺点:MSMQ不适合于Client需要Server端实时交互情况.大量请求时候,响应延迟.
5. ActiveMQ:
ActiveMQ 是Apache出品,最流行的、功能强大的即时通讯和集成模式的开源服务器。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMSProvider实现。提供客户端支持跨语言和协议,带有易于在充分支持JMS 1.1和1.4使用J2EE企业集成模式和许多先进的功能。(官网:http://activemq.apache.org/ 5.3.0)
ActiveMQ架构图如图5-1所示:
优点:
(1). 支持多种语言和协议编写客户端。语言:Java、C、C++、C#、Ruby、Perl、Python、PHP。应用协议:OpenWire、Stomp REST、WS Notification、XMPP、AMQP
(2). 支持多种传送协议:in-VM、TCP、SSL、NIO、UDP、JGroups、JXTA。
(3). 支持通过JDBC和journal提供高速的消息持久化。
(4). 从设计上保证了高性能的集群,客户端-服务器,点对点,执行效率高。
(5). 使用环境简单,支持自动重连,支持Ajax,支持与Axis的整合。
(6). 可以很容易得调用内嵌JMSprovider,进行测试
缺点:
(1). 传输文件不方便,而且效率相对来说不是很高
6.RabbitMQ
RabbitMQ是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成,因此也是继承了这些优点。
主要要说两个组件:Exchange和 Queue (在 AMQP 1.0 里还会有变动),如下图所示,绿色的 X 就是 Exchange ,红色的是 Queue ,这两者都在 Server 端,又称作 Broker ,这部分是 RabbitMQ 实现的,而蓝色的则是客户端,通常有 Producer 和 Consumer 两种类型:
架构图如图6-1所示:
(官网: http://www.rabbitmq.com/1.7.0 )
优点:
(1).RabbitMQ易于使用和部署,适宜于很多场景如路由、负载均衡或消息持久化等,用消息队列只需几行代码即可搞定。
(2).对外提供客户端API,支持多种编程语言。
(3).基于erlang语言开发具有高可用高并发的优点,适合集群服务器。
(4). 健壮、稳定、易用、开源、跨平台、支持多种语言、文档齐全。
(5). 有消息确认机制和持久化机制,可靠性高。
缺点:
(1).这使得它的可扩展性差,速度较慢,因为中央节点增加了延迟,消息封装后也比较大。
7.ZeroMQ:
ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。ZeroMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间。ZeroMQ是一个非常轻量级的消息系统,专门为高吞吐量/低延迟的场景开发,在金融界的应用中经常可以发现它。与RabbitMQ相比,ZeroMQ支持许多高级消息场景,但是你必须实现ZeroMQ框架中的各个块(比如Socket或Device等)。
ZeroMQ架构图如图7-1所示:
ZeroMQ优点:
(1).简单,仅仅提供24个API接口,风格类似于BSDSocket。处理了网络异常,包括连接异常中断、重连等。改变TCP基于字节流收发数据的方式,处理了粘包、半包等问题,以msg为单位收发数据,结合Protocol Buffers,可以对应用层彻底屏蔽网络通信层。对大数据通过SENDMORE/RECVMORE提供分包收发机制。通过线程间数据流动来保证同一时刻任何数据都只会被一个线程持有,以此实现多线程的“去锁化”。通过高水位HWM来控制流量,用交换SWAP来转储内存数据,弥补HWM丢失数据的缺陷。服务器端和客户端的启动没有先后顺序。
(2).灵活,支持多种通信协议,可以灵活地适应多种通信环境,包括进程内、进程间、机器间、广播。支持多种消息模型,消息模型之间可以相互组合,形成特定的解决方案。
(3).跨平台,支持Linux、Windows、OS X等。
(4).多语言,可以绑定C、C++、Java、.NET、Python等30多种开发语言。
(5).高性能,相对同类产品,性能卓越。
ZeroMQ缺点:
(1). 过高的效率会造成可靠性下降,偶然会丢失某些消息的现象。
下图是来自于Internet的性能测试数据。显示的是每秒钟发送和接受的消息数。整个过程共产生1百万条1K的消息,测试环境为Windows 。从测试数据可以看出,ZeroMQ的性能远远高于其它3个MQ。
但是测试数据仅供参考,因为缺少必须的环境参数和性能指标,比如:CPU参数、内存参数、消息模型、通信协议、极限时消耗CPU百分比、极限时消耗内存百分比等。大家可做参考。
8.KAFKA:
Kafka是Apache下的一个子项目,是一个高性能跨语言分布式Publish/Subscribe消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。具有以下特性:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现复杂均衡;支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka通过Hadoop的并行加载机制来统一了在线和离线的消息处理,这一点也是本课题所研究系统所看重的。Apache Kafka相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。Apache Kafka架构图如下图所示:
Kafka优点:
(1).通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。
(2).高吞吐量:即使是非常普通的硬件kafka也可以支持每秒数十万的消息,适合产生大量数据的互联网服务的数据收集业务。
(3).支持通过kafka服务器和消费机集群来分区消息。
(4).支持Hadoop并行数据加载。
国内中间件发展:
阿里中间件——消息中间件Notify和MetaQ:
Notify是淘宝自主研发的一套消息服务引擎,是支撑双11最为核心的系统之一,在淘宝和支付宝的核心交易场景中都有大量使用。消息系统的核心作用就是三点:解耦,异步和并行。通过消息中间件,应用程序或组件之间可以进行可靠的异步通讯来降低系统之间的耦合度,从而提高整个系统的可扩展性和可用性。
以下链接是淘宝的一个经典中间件,大家可以参考学习下!
(详细见 http://www.tuicool.com/articles/AfQRru)
作者:Jack-fan