blyang 你长的很好看啊~
关于消息中间件
发表于: | 分类: Application | 评论:1311 | 阅读: 67338

一、什么是消息中间件

消息中间件是一套平台,用于应用之间的数据通信。举个例子:淘宝网的用户注册,在注册的同时需要有一系列的操作,如下图:

同时,伴随着业务的扩展,后端流程还会增加。如果在注册时要顺序的完成每一步操作,整个流程会耗费很多的时间,从而使得用户等待延迟增加。最容易想到的处理方法是将串行改为并行处理,如下图:

并行虽然能提速,但是由于各个流程之间有同步要求,如果某个流程耗时过长,就会导致整体的等待时间过长。考虑具体的业务,用户注册这个操作只和注册是否成功有及时一致性要求,其他流程都允许有延迟,所以可以将用户注册分为两部分完成,分别是主流程和消息推送流程。主流程只负责用户注册,给出及时性响应,如下图:

而消息推送流程,则是将用户注册消息提交给消息中间件,由消息中间件推送给各个需要该消息的业务流程,延迟处理,如下图:
请输入图片描述

消息中间件的作用就是用于将某一消息推送给各个需要的业务流程,它相当于一个投递员,当收到消息之后,传递给多个需要这条消息的第三方。



二、消息中间件的两种模式

2.1生产者消费者模式:点对点(Queue),不可重复
生产者将消息放入队列中, 多个消费者同时监听队列,谁先抢到消息就取走消息,每条消息最多只能被一个消费者拥有。

2.2发布者订阅者模式:点对多点(Topic)
发布者将消息发布到队列中,多个监听队列的消费者都会收到一份消息。每一份消息都会推送给它的所有订阅者。



三、消息中间件的几个特点
消息中间件有几个特点,分别是

  • 分布式:消息中间件要求分布式部署,满足大规模数据并发能力,同时要求可扩展
  • 可靠性:可靠,数据一致性要求高,要求避免数据丢失,提供持久化,落盘和落数据库都可选
  • 异步:借用消息中间件将消息处理从同步拆解为异步,提高系统性能
  • 松耦合:消息发布者和订阅者之间完全解耦,两者互不知道对方的存在,借助于中间件实现松耦合
  • 事件驱动:通过消息队列,将事件拆分为若干个消息,同时能追溯整个变化过程



四、消息处理过程

4.1消息生产者将消息发送到消息中间件
消息中间件提供数据接收接口,可以使用TCP和Http两种协议方式,一般内网长连接使用TCP,保障速度和效率。公网使用Http,用于跨防火墙


4.2消息中间件接收消息,并将消息转发给订阅者队列
由于消息中间件稳定性要求,消息接收后一般要做持久化,一般是落盘,也可以选择落数据库


4.3消息订阅者处理消息队列
处理消息队列时,可以由消息中间件推送给订阅者,也可以由订阅者拉取。
消息处理的级别有不同,主要有三种,分别是:最多处理一次、至少处理一次、准确的仅处理一次。其中:

  • 最多处理一次:消息仅消费一次,无论消息是否已经消费成功,都不再发送。此时可能遇到数据丢失的问题,尽管消息中间件已经将消息发送给了消费者,但是并没有能成功得到消费。
  • 至少处理一次:消息消费者若没有返回有效值,消息中间件将再次推送消息给消费者,保证消息得到处理。此时可能会造成重复现象。
  • 精确的仅处理一次,消息中间件得到有效返回值之后进行剩余操作,此时要求仅处理一次,若返回值为失败,将再次推送,若返回值成功,则消息移出队列。这种方式对机器性能消耗较高。



五、消息中间件的应用场景

消息中间件主要有以下一些主要的应用场景,分别如下:

5.1业务解耦
由于系统业务流程较多,如果一次操作所有的流程,耗时较长。通过消息中间件平台,将消息发送给各个消费者,使得各个消费者仅需要处理自己的业务逻辑,而不需要等待其他消费者的状态,从而实现消息的异步处理,提高系统对消息的处理性能。

5.2削峰填谷
一般来说,消息中间件相当于一个消息缓冲池。当上游的系统吞吐量高于下游第三方消费者的吞吐量的时候,如果直接推送给第三方,会使得第三方由于来不及处理,使得系统崩溃。如果采用消息中间件,上游的峰值数据可以在消息中间件平台得到缓冲,而第三方则按照自身的消费能力去处理消息队列,达到均衡峰谷数据量的作用。

5.3广播通知
系统中一个状态,需要通知多个第三方,借用消息中间件平台,实现高效、高可用的系统广播。

5.4 日志分析
日志分析是大规模分布式系统不可避免的一个环节,用于快速定位系统问题,高效运维,实现高可靠的系统。一般来说,日志分布在若干台机器上,借助于消息中间件,收集多台机器上的日志数据,统一到日志分析平台作处理。



六、常见的消息中间件产品

Notify:淘宝之前使用的消息中间件系统,使用MySQL作为落地媒介,可完全水平扩展
Kafka:Apache基金会支持的开源项目,实现高效的持久化,常用于日志系统
RocketMQ:淘宝开源的一个消息中间件,原本是借鉴了kafka的思路实现的中间件,原名称为MetaQ,后来开源捐献给Apache基金会,改名为RocketMQ。

其他的,包括JMS、ActiveMQ、ZeroMQ等等,有兴趣自己看吧。重点推荐RocketMQ。

引用1、http://www.tuicool.com/articles/zqyYrm
引用2、http://blog.csdn.net/heyutao007/article/details/50131089
引用3、http://m.blog.csdn.net/article/details?id=51868006

评论已关闭

TOP