您的位置:首页 > 其它

什么是消息中间件?

2018-07-29 15:05 155 查看
版权声明:原创内容,如需转载请联系作者。 https://blog.csdn.net/CrankZ/article/details/81271218

什么是中间件

中间件是在操作系统功能范围外为应用提供服务的多用途软件。任何位于内核和用户应用之间的软件都可以是中间件。

分析师兼系统理论家 Nick Gall 表示,“中间件是作用于软件的软件。” 中间件不提供传统应用的功能,而是将软件与其他软件衔接。中间件是您 IT 基础架构的输水管,因为它使得数据能从一个应用流动到另一个中。

中间件分为两大类:

一类是底层中间件,用于支撑单个应用系统或解决单一类问题,包括

  • 交易中间件(TPM)
  • 应用服务器(WAS)
  • 消息中间件(MOM)
  • 数据访问中间件(UDA)

另一类是高层中间件,更多用于系统整合,包括

  • 企业应用集成中间件(EAI Suites)
  • 工作流中间件(Workflow)
  • 门户中间件(Portal)

它们通常会与多个应用系统打交道,在系统中的层次较高,并大多基于底层中间件运行。

小结:

你只需要【消息中间件】只是【中间件】的其中一种就行了。
 

什么是消息队列中间件

消息队列中间件也称消息中间件或消息队列(MQ)

消息队列(Message Queue)一般大家习惯简称为MQ。主要特点为异步处理,也就是说消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。

开源的消息队列有很多如rabbitmq,kafka,rocketmq,activemq,ZeroMQ …,针对不同的业务场景、使用不同的编程语言,可能有不同的选择。不同的队列都有优缺点,性能、稳定性、文档、客户端等方面各有优势。但不管选择哪一个,有些业务中,消息队列并不能解决全部问题,比如消息丢失、消息重复、消息顺序等问题,需要根据队列的特性在应用中自己设计处理。

典型的消息中间件包含 3 部分 :

  1. producer(发布者)
  2. broker(消息中间件)
  3. consumer(消费者)

是一个比较简单的模型,下图展示了把消息发送给 consumer 的全过程。

为什么要用消息队列

为什么需要消息队列,主要有以下几个场景:

  1. 异步处理
  2. 应用解耦
  3. 系统间通讯
  4. 消息队列
  5. 驱动型架构
  6. 错峰与流控
  7. 日志收集
  8. 广播等待

例子1

你的快递到了,快递小哥给你打电话

快递小哥:你的快递到了,我是XX公司的,我在XX地方,你快来。

你:好的

结果你到了XX地方,你要问快递小哥在哪,快递小哥也要问你是谁,双方确认了身份才能拿快递。假设下次换了一个快递小哥、或者下次你让你小伙伴替你拿快递,还是要重新问。

  • 特点:强耦合
  • 缺点:修改维护成本大,修改一处,调用它的地方也要修改,牵一发而动全身。

这时候菜鸟驿站出现了,快递小哥不管你是谁,你也不必知道他是谁、他是哪个快递公司的。快递小哥直接把快递放到菜鸟驿站,然后给你发个短信他就走了。你看到短信抽个时间去拿就行了。

  • 特点:松耦合
  • 好处:提高开发效率,各部门只需要关注自己的功能。

例子2

快递小哥:你的快递到了,下来拿快递

你:好的,马上到

这时候快递小哥必须要等你,你来了之后他才能走,在此期间他什么也不能做,只能等你

  • 特点:同步
  • 缺点:效率低,快递小哥可能还有其他快递要送,但是却只能等你,不能继续送快递。

这个时候菜鸟驿站出现了,快递小哥只需要把快递放到菜鸟驿站,然后发个短信给你,他就可以走了。而你也可以抽你有空的时候去拿快递。

  • 特点:异步
  • 好处:高并发,效率高

例子3

快递小哥:你买的100个辣条到了。

你:太多了,我一次也吃不完啊。

快递小哥:我不管,我还有其他快递要送呢,你快点过来。

  • 特点:高峰流量
  • 缺点:流量太多,你处理不过来,崩溃。

这时候菜鸟驿站出现了,快递小哥不必等你,直接把100个辣条放到菜鸟驿站,然后给你发个短信就OK了。

你也不必一次性全部拿到你的房间,能吃多少拿多少就行了

  • 特点:流量削峰
  • 好处:防止系统崩溃,有序处理

综上所述,采用消息队列的好处又:

  • 解耦
  • 异步
  • 流量削峰

当然还有一些其他功能,比如

  • 横向扩展
  • 安全
  • 消息有序
  • 等等···

消息队列的协议

不同的消息队列,可能会遵循不同的公共协议,也有可能自己制定的协议。比如OpenMQ支持JMS协议,rabbitmq支持AMQP协议,ActiveMQ支持比较多,而Kafka和rocketmq则有自己的一套玩法,现在ali在搞Open Messaging规范,希望大家都支持。下面简单介绍几种协议。

这里值介绍JMS和AMQP,着重介绍JMS

JMS协议

Java消息服务(Java Message Service),是一个Java平台中关于面向消息的中间件的API,用于两个应用程序之间或者分布式 系统中发布消息,进行异步通信。

JMS消息模型

在JMS标准中,有两种消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub)。

P2P(点对点)

P2P模式包含三个角色

  1. 生产者(Producer)
  2. 消息队列(Queue)
  3. 消费者(Consumer)

每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。

P2P的特点

  1. 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
  2. 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
  3. 接收者在成功接收消息之后需向队列应答成功

如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式。

Pub/Sub(发布/订阅)

包含三个角色

  1. 发布者(Publisher)
  2. 角色主题(Topic)
  3. 订阅者(Subscriber)

多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

Pub/Sub的特点

  1. 每个消息可以有多个消费者。
  2. 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者。
  3. 它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。

为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型

AMQP协议

AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。 基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有 RabbitMQ等。

AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

JMS与AMQP对比

常见消息队列(MQ)

RabbitMQ

RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量级,更适合于企业级的开发。同时实现了Broker构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负 载均衡或者数据持久化都有很好的支持。

Kafka

Kafka是Apache下的一个子项目,是一个高性能跨语言分布式Publish/Subscribe消息队列系统,而Jafka是在Kafka之上孵 化而来的,即Kafka的一个升级版。具有以下特性:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到 10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现复杂均衡;支持Hadoop 数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka通过Hadoop的并行 加载机制来统一了在线和离线的消息处理。Apache Kafka相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。

ActiveMQ

ActiveMQ是Apache下的一个子项目。 类似于ZeroMQ,它能够以代理人和点对点的技术实现队列。同时类似于RabbitMQ,它少量代码就可以高效地实现高级应用场景。

参考:

http://www.uml.org.cn/zjjs/201802012.asp

https://github.com/Letitmiss/JMS

https://www.redhat.com/zh/topics/middleware/what-is-middleware

https://blog.csdn.net/lovesomnus/article/details/51788075

http://thoreauz.com/2017/08/10/middleware/mq/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: