文档章节

消息中间件

 张欢19933
发布于 2017/06/26 14:53
字数 1664
阅读 209
收藏 4

概念

消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。

消息中间件适用于需要可靠的数据传送的分布式环境。采用消息中间件机制的系统中,不同的对象之间通过传递消息来激活对方的事件,完成相应的操作。发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。消息中间件能在不同平台之间通信,它常被用来屏蔽掉各种平台及协议之间的特性,实现应用程序之间的协同,其优点在于能够在客户和服务器之间提供同步和异步的连接,并且在任何时刻都可以将消息进行传送或者存储转发,这也是它比远程过程调用更进一步的原因。

特性

1.Message Priority
Producer把消息发送给Broker来存储,那么我们就可以再消息队列中对我们的消息来进行排序,实现不同的优先级。从而满足我们复杂的业务需求。
2.Message Order
消息排序,有的消息的处理是需要按照一定的顺序进行处理的,比如用户的创建订单、订单付款、订单完成。那么对于消费者也需要按照这个流程来消费,否则就没有意义了。
3.Message Filter
在消息对立中,也可以对我们的消息进行过滤,比如按照消息类型等条件来过滤
4.Message Persistence
消息的持久化,一般有以下几种方式
 (1)持久化到数据库,比如MySQL
 (2)持久哈到KV存储,比如redis
 (3)文件形式持久化
消息的持久化,防止了系统挂掉后,仍然能够从之前备份中恢复出来。
5.Broker的Buffer满了怎么办?
我们知道Broker是用来存储需要处理的消息,如果消息过多,导致Buffer满了怎么办?
这时候就会采取一定的策略来丢弃已有的消息。
6.事务的支持
正如上面所谈到的订单的操作,因此消息中间件中也会提供对分布式事务的支持。
7.定时消息
在实际应用中,有时也会需要定时消费的功能,因此中间件中,也会对消息进行排序,然后实现定时发送或者消费消息的业务需求。
8.消息重试
考虑一下这个问题,如果消息消费失败后,怎么办,是等待处理这个消息呢?还是让消费者在此消费一次呢?通常情况下,采取后者的形式,因为大多数情况下,消费失败的原因在于该消息本身的原因,如果在此消费这个消息的话,还是会出现失败的情况,因此通常采取在此发送消息在此消费消息的方式。
9.回溯消费
什么是回溯消费呢?对于已经消费成功的消息,是不是在Broker中就丢弃该消息呢?显而易见是不可能的,因此需要中间件对该功能支持,支持已经消费的信息进行时间段内的存储,等待某一刻内该消息会被重新消费的可能。

应用实例

假设我们有这么一个应用场景,为了完成一个用户注册淘宝的操作,可能需要将用户信息写入到用户库中,然后通知给红包中心给用户发新手红包,然后还需要通知支付宝给用户准备对应的支付宝账号,进行合法性验证,告知sns系统给用户导入新的用户等10步操作。 那么针对这个场景,一个最简单的设计方法就是串行的执行整个流程,如图所示:

这种方式的最大问题是,随着后端流程越来越多,每步流程都需要额外的耗费很多时间,从而会导致用户更长的等待延迟。自然的,我们可以采用并行的方式来完成业务,能够极大的减少延迟,如图所示。

但并行以后又会有一个新的问题出现了,在用户注册这一步,系统并行的发起了4个请求,那么这四个请求中,如果通知SNS这一步需要的时间很长,比如需要10秒钟的话,那么就算是发新手包,准备支付宝账号,进行合法性验证这几个步骤的速度再快,用户也仍然需要等待10秒以后才能完成用户注册过程。因为只有当所有的后续操作全部完成的时候,用户的注册过程才算真正的“完成”了。用户的信息状态才是完整的。而如果这时候发生了更严重的事故,比如发新手红包的所有服务器因为业务逻辑bug导致down机,那么因为用户的注册过程还没有完全完成,业务流程也就是失败的了。这样明显是不符合实际的需要的,随着下游步骤的逐渐增多,那么用户等待的时间就会越来越长,并且更加严重的是,随着下游系统越来越多,整个系统出错的概率也就越来越大。

通过业务分析我们能够得知,用户的实际的核心流程其实只有一个,就是用户注册。而后续的准备支付宝,通知sns等操作虽然必须要完成,但却是不需要让用户等待的。 这种模式有个专业的名词,就叫最终一致。为了达到最终一致,我们引入了MQ系统。业务流程如下:

主流程如图所示:

用户注册流程-引入MQ系统-主流程

异步流程如图所示:

用户注册流程-引入MQ系统-异步流程

发布-订阅消息模式已经呈现在我们面前,利用它可以产生更灵活、更松散耦合的系统。

© 著作权归作者所有

粉丝 47
博文 533
码字总数 244932
作品 0
海淀
私信 提问

暂无文章

mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
今天
9
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
今天
6
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
今天
8
0
Flutter 系列之Dart语言概述

Dart语言与其他语言究竟有什么不同呢?在已有的编程语言经验的基础上,我们该如何快速上手呢?本篇文章从编程语言中最重要的组成部分,也就是基础语法与类型变量出发,一起来学习Dart吧 一、...

過愙
今天
5
0
rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部