消息中间件(1)

摘要:
对于消息中间件,其最基本的功能是负责模块之间的消息交互。在消息的生命周期中,2、3和4与消息队列相关,因此消息中间件通常需要以下功能。面向消息的中间件应该尽可能避免停机,否则会影响整个系统的可用性。如果消息中间件失效,生产者和消费者将完全失去数据交互的方式。面向消息中间件的一般结构在面向消息中间件模型中通常具有以下基本角色:1.生产者。此角色还监视和检查消息存储队列的状态。

问题的起源

​ 在深入了解消息中间件之前,我想先搞清楚为什么会出现消息中间件这么一款产品,换句话说我们需要弄清楚消息中间件到底解决了一个什么问题。

​ 在互联网的初级阶段,那个时候一方面没有想现在如此多的用户,另一方面也没有太复杂的业务场景,在那个阶段,应用的架构往往是垂直式的,通俗的讲就是在一个工程中解决所有的问题。那么从进程角度来看,在这一阶段中所有的问题都在一个进程中解决。在这样的大背景下,一个应用同样会分层、会分模块,但是这样的划分往往是逻辑上的,从进程角度而言,模块之间的数据交互是通过进程内的函数调用,或者一些公共类来完成,这个阶段的数据交互没有太多复杂的要求也没有太多复杂操作。

​ 随着业务的发展,用户数量越来越多,同时应用的业务场景也越来越复杂,应用的功能也越来越丰富,此时为了满足业务发展需求同时提高开发效率,应用的各个模块开始拆分,每个模块开始独立开发、独立测试、独立发布、独立的下线。此时由于应用的复杂性可控,模块之间的数据交互可能是用一些restful的接口,也有可能使用的RPC方式,在这种方式下,模块之间的调用逻辑清晰,问题排查方便迅速,从进程角度看,模块之间的数据交互是不同进程之间的数据交互,而这些进程往往是不同节点上的进程,通过网络交换数据。

​ 随着业务的进一步发展,越来越多的业务场景被挖掘出来,同时该应用的功能进一步的丰富,而传统的模块之间使用RPC进行数据交互的方式越来越制约业务的发展,例如,新增一个业务模块,会造成大量的模块进行改造,增加RPC调用接口,同时某一个模块下线也需要大动干戈的对其他模块进行改造,在这种大背景下,模块之间通过RPC进行数据交互的复杂度完全失控,模块的上线,下线都将会涉及到大规模的其他模块的改造。

​ 在计算机的世界中,没有什么问题不是一个中间层不能解决的,如果有,那就再加一层。依据这个思路,模块之间的数据交互可以通过增加一个第三方的中间层来解决,这个第三方就是消息中间件。

消息中间件的职责

​ 上一节我们分析了为什么会出现消息中间件,那么对于消息中间件的职责这个问题的答案就呼之欲出。对于一款消息中间件而言,它最基本的功能就是负责模块之间的消息交互。但是这个最基本的功能却不像它看起来那么简单。

​ 在目前的微服务结构中,某些模块之间的数据交互由消息中间件来承担,从消息中间件的角度而言,它负责从消息的生产方拿到消息,再将消息投递到消息的消费放,在这个环节中消息的生命周期如下,1、消息被生产者生产,2、消息被生产者投递,3、消息在消息队列中存储,4、消息被消息队列交付,5、消息被消费者消费。在消息的生命周期中2、3、4都和消息队列相关,因此消息中间件一般需要如下的几个功能。

​ 1、高可用。消息中间件应当尽量避免发生宕机问题,否则会影响到整个系统的可用性。消息中间件宕机,则生产者和消费者完全失去了数据交互的途径。

​ 2、具备稳定的交付投递能力,消息在从生产者投递到消息中间件的过程中消息的状态不应该出现二义性,要么已经投递,要么投递失败,同理消息在从消息中间件交付到消费者的过程中也不应当存在二义性。

​ 3、具备一定的消息积压能力,一般而言生产者的处理能力和消费者的处理能力不一定匹配,在这个过程中很可能会出现消息大量的堆积在消息中间件的队列中,消息中间件需要具备消息堆积能力,并且在这个场景下仍要保证消息中间件的性能。

​ 4、消息的固化能力,消息中间件的本职工作是架起生产者和消费者的桥梁,因此在理论上消息中间件不应当出现丢消息的现象,就算在某些不得已的场景下需要丢弃部分消息,也需要某些类似重传的机制。

消息中间件的一般结构

​ 在消息中间件的的模型中一般存在一下几个基本角色:

​ 1、生产者。生产者负责产生消息并将消息投递到消息队列

​ 2、消息的存储管理队列。消息在被投递后,一般在此处暂存,等待交付

​ 3、消息的消费者。消费者负责消费消息,

​ 一般而言除了以上三种最基本的角色外,为了完善消息队列的功能,还会存在下列角色

​ 消息队列的协调者,该角色负责协调消息的存储队列,一般而言,生产者和消费者从协调者处得到消息存储队列的相关信息,从而和消息存储队列进行交互。该角色还监控检查消息存储队列的状态。

免责声明:文章转载自《消息中间件(1)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇element 表格回显默认选中的一行在第一行显示JS/jQuery刷新iframe的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

1.kafka

什么是Kafka 1.Apache Kafka是一个开源消息系统,由Scala写成。 2.Kafka是一个分布式消息队列。Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。 3.无论是kafka集群,还是cons...

消息队列之 ActiveMQ

简介 ActiveMQ 特点 ActiveMQ 是由 Apache 出品的一款开源消息中间件,旨在为应用程序提供高效、可扩展、稳定、安全的企业级消息通信。 它的设计目标是提供标准的、面向消息的、多语言的应用集成消息通信中间件。ActiveMQ 实现了 JMS 1.1 并提供了很多附加的特性,比如 JMX 管理、主从管理、消息组通信、消息优先级、延迟接收...

SQL2008R2链接SQL2000:该访问接口支持该接口,但使用该接口时返回了失败代码

SQL2008R2x64链接SQL2000时,报如下错误: /* 链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "未指定的错误"。 链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "在该服务器上找不到完成该操作所需的存储过程。请与系统管理员联系。"。 消息 7311,级别...

百度竞价门再跟踪:违规医疗广告数量仍大幅增加

网易科技讯 2月18日消息,网易科技日前收到一份署名为反流氓软件联盟的《百度医疗医药广告统计报告》(以下简称报告),据该调研报告中显示,在百度医疗医药竞价排名广告违规被媒体曝光后,这类广告数量随后有所减少,不过在风波平息后,此类广告数量又大幅增加,并且现在仍有大量违规医疗广告。 医疗类广告数量高达遭曝光时两倍 百度在2008年11月因受到媒体曝光影响...

Java转码工具native2ascii

背景:在做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,比如常见的validator验证用的消息资源(properties)文件就需要进行Unicode重新编码。原因是java默认的编码方式为Unicode,而我们的计算机系统编码常常是GBK等编码。需要将系统的编码转换为java正确识别的编码问题就解决了。 1、native2asc...

源码分析Kafka 消息拉取流程

本节重点讨论 Kafka 的消息拉起流程。 @ 目录 1、KafkaConsumer poll 详解 1.1 KafkaConsumer updateAssignmentMetadataIfNeeded 详解 1.1.1 ConsumerCoordinator#poll 1.1.2 updateFetchPositions 详解 1.2 消息拉...