设为首页 收藏本站
查看: 2270|回复: 0

[经验分享] 互联网网站架构升级----消息中间件的实现方案

[复制链接]

尚未签到

发表于 2015-11-28 17:10:57 | 显示全部楼层 |阅读模式
消息中间件对目前大中型互联网来说是非常重要的,在业务数据流动中仅次于RPC服务调用,担负着越来越复杂的网站业务从主流程上解耦的重要责任;
伦理片 http://www.gxuy.com/
    从目前互联网对消息中间件的需求来看应该分为两种类型,一种是和钱相关的需求,一种是和钱无关的需求;和钱相关的需求消息的可靠性是放在第一位的,和钱无关的需求是速度放在第一位的,但这两种需求又是矛盾的,很难设计出一种既可靠又高效的系统,除非将两套方案捏合成一个系统,通过配置来选择不同方案,但从实现上说还是两种实现。所以目前业界有几种不同的设计方式来满足不同的需求。

下面看看以下几种典型实现方案:

1、以ActiveMQ为代表的可靠性优先的设计原理:
DSC0000.jpg
    此种方案将所有的消息数据和消息的发送状态都存储在消息服务器上,可以在消息服务上通过多种手段来保证消息的可靠性,但增加了众多复杂的可靠性保证手段后,消息从发布者到订阅者的速度势必会受到影响;此种方式发布者将消息推向消息服务器,消息服务器再将消息推向订阅者,为消息发送策略提供了很好的可扩展性;

2、以KafKa为代表的速度优先的设计原理:

DSC0001.jpg

    此种方式将消息的发送状态保存在客户端,同时客户端用拉的模式从消息服务器上获取消息,由于是顺序读,同时还采取了很多保证速度的策略,如zero-copy,所以此种方案速度比较快,但牺牲了很多可靠性方面的保证,比较适合Web2.0网站,这些网站对消息的可靠性要求不是很高,同时由于产生了大量的和用户状态相关的消息,需要一个高效的系统来处理这些消息;另外这种方案也比较适合日志消息的收集;


3、传统的系解耦方案:

DSC0002.gif

    此种方式是不用消息中间件直接用数据库存储做的解耦,随着消息中间件的出现,这种方式的使用越来越少,但现在由于MongoDB和Redis等的兴起,一些基于这些Nosql数据库的消息应用逐渐兴起,由于消息数据和消息状态都存储在DB上,所以效率和速度在上面两种方案之间;


    那么有没有一种更高效的方式呢?

    答案是肯定的,但那可能要进一步降低可靠性!

    看看Facebook的Scribe日志收集系统的原理:
DSC0003.gif


    如果Scribe Server正常工作,Scribe Client将App的日志(可以看成一个消息)推送到Scribe Server端,如果不正常,则写到本地文件,当Scribe Server恢复正常时再将其推送过去;这里使用本地文件作为缓冲,那么能否综合Scribe和Kafka的优点来设计一个消息系统(或日志收集系统,改造一下可以互用),看下面的方案:
DSC0004.gif
    上面的MQ暂且叫他FastMQ吧,中消息发布端直接写本地文件,同时消息订阅者通过Zookeeper协调,向相关消息发布者的Agent拉消息,并在本地记录消息指针状态;
    如果嫌在消息发布端开启MQ Agent麻烦,那么如中消息拉取协议使用SCP或FTP协议,用这些Linux必备的协议提供者作为Agent减少开发和部署的难度,在服务订阅端解析这些协议流,反序列化为消息供业务使用;
    如果觉得消息只存储在消息发布端的磁盘不可靠,那么如中可以在消息订阅者处理不及消息的时候,把消息数据缓冲在消息订阅端的磁盘上来备份数据,不过这样做就使系统变的复杂,虽然提高了可靠性,但是速度就会有所降低;

    此种方案可以使消息分散的存储在业务本身的磁盘上,避免集中存储相互影响的缺点,同时又可以有效利用业务机器的磁盘(大部分业务机器磁盘基本没使用),另外还可以减少一次网络通信的过程,使从发送到接收的速度更快;但其本身也有不少缺点,要做好监控,避免消息大量积压的时候业务磁盘过度使用,对业务造成影响。

     目前我们的监控日志收集系统使用的是和中类似的方案,消息系统使用的是3方案,后期可能会将可靠性要求高的向1方案过度,可靠性要求不高的向最下面介绍这种过度!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144448-1-1.html 上篇帖子: ubuntu10.10 教育网 使用ipv6,亲测可用【经过再次验证与修正】 下篇帖子: 利用scribe管理log文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表