未来往事
在你力所能及的条件下,努力去多承担、不逃避。 [2018年 第21周/共52周]
当前分类:系统架构,本分类下收藏如下文章:消息队列 | 搜索引擎 | 负载均衡 | 群集架构等相关架构类技术文章

 消息队列中间件的技术选型分析

消息中间件是一种由消息传送机制或消息队列模式组成的中间件技术,利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。目前业界有很多的MQ产品,像RabbitMQ、ActiveMQ、ZeroMQ等都是极好的消息中间件,但是我们在项目中该选择哪个更适合呢?本文针对以下几种消息队列产品作了评估比较:RabbitMQ、ZeroMQ、ActiveMQ、MSMQ、Redis、memcacheQ

题外话:这里我们可以先思考个小问题“Web应用中为什么会需要消息队列服务?”
在高并发环境下,由于来不及同步处理,请求往往会发生堵塞(主要原因),比如说,大量的insert,update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。

RabbitMQ
是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。是AMQP协议领先的一个实现,它实现了代理(Broker)架构,意味着消息在发送到客户端之前可以在中央节点上排队。对路由(Routing),负载均衡(Load balance)或者数据持久化都有很好的支持。此特性使得RabbitMQ易于使用和部署,适宜于很多场景如路由、负载均衡或消息持久化等,用消息队列只需几行代码即可搞定。但是,这使得它的可扩展性差,速度较慢,因为中央节点增加了延迟,消息封装后也比较大。如需配置RabbitMQ则需要在目标机器上安装Erlang环境。

点击在新窗口中浏览此图片


ØMQ(ZeroMQ)
号称最快的消息队列系统,尤其针对大吞吐量的需求场景。是一个非常轻量级的消息系统,专门为高吞吐量/低延迟的场景开发,在金融界的应用中经常可以发现它。与RabbitMQ相比,ZeroMQ支持许多高级消息场景,但是你必须实现ZeroMQ框架中的各个块(比如Socket或Device等)。

ØMQ(ZeroMQ)能够实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,技术上的复杂度是对这MQ能够应用成功的挑战。ZeroMQ具有一个独特的非中间件的模式,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序将扮演了这个服务角色。你只需要简单的引用ZeroMQ程序库,可以使用NuGet安装,然后你就可以愉快的在应用程序之间发送消息了。但是ZeroMQ仅提供非持久性的队列,也就是说如果down机,数据将会丢失。其中,Twitter的Storm中使用ZeroMQ作为数据流的传输。ZeroMQ非常灵活,但是你必须学习它的80页的手册(如果你要写一个分布式系统,一定要阅读它)。

ZeroMQ没有中间件架构,不需要任何服务进程和运行。事实上,你的应用程序端点扮演了这个服务角色。这让部署起来非常简单,但担心的是,你没有地方可以观察它是否有问题出现。就目前了解到的,ZeroMQ仅提供非持久性的队列。你可以在需要的地方实现自己的审计和数据恢复功能。

点击在新窗口中浏览此图片


MSMQ
这是微软的产品里唯一被认为有价值的东西。如果MSMQ能证明可以应对这种任务,他们将选择使用它。关键是这个东西并不复杂,除了接收和发送,没有别的;它有一些硬性限制,比如最大消息体积是4MB。然而,通过和一些像MassTransit 或 NServiceBus这样的软件的连接,它完全可以解决这些问题。

点击在新窗口中浏览此图片


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是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。

点击在新窗口中浏览此图片


Apache ActiveMQ
ActiveMQ居于两者(RabbitMQ & ZeroMQ)之间,类似于ZemoMQ,它可以部署于代理模式和P2P模式。类似于RabbitMQ,它易于实现高级场景,而且只需付出低消耗。
ActiveMQ被誉为Java世界的中坚力量。它有很长的历史,而且被广泛的使用。它还是跨平台的,给那些非微软平台的产品提供了一个天然的集成接入点。然而,它只有跑过了MSMQ才有可能被考虑。如需配置ActiveMQ则需要在目标机器上安装Java环境。

点击在新窗口中浏览此图片

需要注意一点的是ActiveMQ的下一代产品为Apollo,Apollo以ActiveMQ原型为基础,是一个更快、更可靠、更易于维护的消息代理工具。Apache称Apollo为最快、最强健的STOMP(Streaming Text Orientated Message Protocol,流文本定向消息协议)服务器。
Apollo的特性如下:
支持Stomp 1.0和Stomp 1.1协议
主题和队列
队列浏览器
主题持久订阅
镜像队列
可靠的消息传递
消息过期和交换
消息选择器
JAAS验证
基于ACL的授权
支持SSL/TLS,证书验证
REST Management API

点击在新窗口中浏览此图片


Redis
是一个Key-Value的NoSQL数据库,开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。

MemcacheQ
持久化消息队列memcacheq(简称mcq)是一个轻量级的消息队列,MemcacheQ的特性:
1 简单易用
2 处理速度快
3 多条队列
4 并发性能好
5 与memcache的协议兼容。这就意味着只要装了memcache的extension就可以了,不需要额外的插件。
6 在zend framework中使用也很方便。


最终,这几个产品:
+阅读全文

 全文检索:sphinx_elasticsearch_xunsearch选型分析

全文检索:sphinx_elasticsearch_xunsearch选型分析

开发语言:

Sphinx和Xunsearch是基于C/C++开发、Elasticsearch基于java开发

MySQL数据导入及索引生成:

Sphinx > Elasticsearch > Xunsearch
Sphinx跟RDBMS(特别是MYSQL)绑定的特别紧密,在导入MySQL数据生成索引时,从易用性、可靠性、速度上来看,Sphinx优于ElasticSearch。Sphinx真的很快。ElasticSearch官方文档上,数据都是使用RESTful接口一条一条插入的,也就是增量更新。有个bulk接口,可以批量导入、大幅加快速度

增量更新支持:

+阅读全文

安居客网站系统架构案例分享简报

本文为分享的安居客网站系统架构、web系统架构简报,简报加载速度依据你网速的快慢而受影响。
+阅读全文

CDN(内容分发网络)架构 技术原理

概述
Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因数的影响,响应速度慢还是经常抱怨和困扰。解决方案就是在网络传输上利用缓存技术使得Web服务数据流能就近访问,是优化网络数据传输非常有效的技术,从而获得高速的体验和品质保证。

......
+阅读全文