分布式消息中间件设计
目录
1、什么是分布式消息中间件
1.1、单体架构
1.2、分布式系统架构
2、基于消息中间件的分布式系统架构
2.1、什么是消息中间件
2.2消息中间件概述
3、消息中间件的核心设计
3.1、本质
3.2、五大核心组成部分
3.2.1、协议
3.2.2、持久化
3.2.3消息分发
3.2.4高可用
3.2.5高可靠
1、什么是分布式消息中间件
1.1、单体架构
单体应用:所有代码、模块,全部放在一个应用里面。如果其中一个模块要升级,那么整个系统全部要升级。如果部署在十个机器中,改了一个小功能,十个机器全部都得升级。
面临问题:耦合度高、开发困难,面临的问题很多
1.2、分布式系统架构
分布式系统:将一个大的系统按照业务模块、功能模块的技术划分,分成多个独立的子系统。
下图将一个大系统拆分为前台系统、订单系统、会员系统 ,各系统之间相互独立、独立部署。升级某一个系统,其他子系统不需要调整。
用户发送请求到前台系统,用户的一个请求不是一个前台系统可以完成的。
例如:用户需要自己的订单信息和会员信息,发送请求到前台系统,前台系统需要系统订单系统和会员系统,处理此次请求。
像这种多系统协同处理一个请求的场景,我们称为分布式系统。
系统与系统之间也存在相互调用,这就需要rpc(远程过程调用)技术。这样的做法,系统之间存在强耦合度。为了实现降耦合,实现更强的扩展性架构,所以在分布式系统中引入了消息中间件。
通过消息中间件解决系统之间的耦合
2、基于消息中间件的分布式系统架构
用户发送创建订单的请求,并不是直接由订单系统处理。
用户发送创建 订单的请求给前台系统,前台系统将请求传递至消息中间件暂存之后,由消息中间件传递给对应的子系统处理,再进行一个客户端的相应。
2.1、什么是消息中间件
消息中间件:临时存储一些消息、一些数据的,独立部署的,所以叫中间件。用于各个系统之间,进行数据交换的。
系统之间用了这个消息中间件之后,就没有一个直接的关联了,不会直接调用,由消息中间件进行转换。
系统之间交换数据:可以用接口直接调用、还可以用消息中间件异步处理,异步分发。
2.2消息中间件概述
什么是消息中间件
①利用高效可靠的消息传递机制进行平台无关的数据交流。
②并基于数据通信来进行分布式系统的集成。
③通过提供消息机制和消息排队模型,它可以在分布式环境下扩展进程间的通信;
消息中间件的应用场景
- 跨系统数据传递
- 高并发流量削峰
- 数据异步处理等
例如:现在有1万条数据需要插入数据库,直接插入数据库压力大,可以将插入数据缓存在消息中间件里,异步处理,流量削峰,降低并发量。
常见的消息中间件
ActiveMQ、RabbitMQ、Kafka、RocketMQ
这些都是基于网络的,基于消息传递机制的,也就是生产者消费者的场景。
3、消息中间件的核心设计
我们自己怎么去写消息中间件?
3.1、本质
一种可以接收请求、保存数据、发送数据等功能的网络应用。
和一般的网络应用的区别:它主要负责数据的接收和传递,所以性能一般都高于普通程序。
3.2、五大核心组成部分
- 协议
- 持久化机制
- 消息分发机制
- 高可用设计
- 高可靠设计
3.2.1、协议
协议是计算机通信之间共同遵从的一组约定,都遵守相同的约定,计算机之间才能相互交流。
是对数据格式和计算机之间交换数据时必须遵守的规则的正式描述。
例如:服务端xml数据,客户端用json解析数据。不遵守同一协议无法解析。
协议三要素:
- 语法:数据与控制信息的结构与格式。(传输数据的结构是什么样子的)
- 语义:需要发出何种控制信息,完成何种动作以及做出何种响应(发送什么样的信息)
- 时序(同步):事件实现顺序的详细说明
常见协议
Http协议三要素:
语法:规定了请求报文和响应报文的具体格式。(nio、bio)
语义:客户端主动发起的操作称为请求;(post、get请求...)
时序:一个请求对应一个响应(request、respond)
http不太适合消息中间件MQ来使用,
消息中间件常用的协议:
OpenWire(ActiveMQ专属)、AMQP、MQTT、Kafka、OpenMessage
为什么消息中间件不使用Http协议?
①http请求内容很多,一个简单的请求需要传递一堆的数据,语法格式复杂,包含请求头、Coking等信息,状态码信息等。消息中间件,需要的是单一的,尽量简洁、尽量减少我们传递数据的大小。这就是大部分消息中间件不使用Http的原因,Http太大了。
②Http大部分情况下都是短连接。每次交互请求响应之后,就会中断,不利于消息中间件的场景。因为消息中间件可能是一个客户端长期去获取消息中间件里的信息,或者往消息中间件里发数据,不太适合短连接
AMQP协议:
Advanced Message Queuing Protocol 高级消息队列协议。
04年Jpmorgan Chase 摩根大通集团联合其他公司共同设计。
特性:
事务支持、持久化支持 ,出生金融行业,在可靠性消息处理上具备天然的优势。
MQTT协议:
Open Message协议
Kafka协议:
3.2.2、持久化
简单来说就是将数据存入磁盘,而不是存在内存中,随服务重启而消失,使数据能够永久保存叫做持久化。
不做持久化,服务器突然宕机,消息中间件中未处理的消息就会消失。
常用的持久化方式
写到日志文件,特定格式存储。或者用数据库的场景。
3.2.3消息分发
消息中间件中的数据,将消息推送给消费者。消费者拉取消息队列中的数据。
为什么要有消息分发策略?
一个消息中间件链接多个系统,消息中间件中的消息应该发送给那个系统呢?根据什么样的策略准确发送给对应的系统
第一次发送给消费者,处理错误,是否可以重发,继续分发处理
常用的消息中间件分发策略
3.2.4高可用
高可用机制
高可用是指产品在规定的条件和规定的时刻或时间区间内处于可执行规定功能状态的能力。
当业务量大时,一台消息中间件可能无法满足需求,所以需要消息中间件能够集群部署,来达到高可用目的。
Master-Slave主从共享数据的部署方式:
主broker获取数据,消息存储,其他broker可以共享读取。
Master-Slave主从同步部署方式:
生产者发送数据过来,会把数据存储在 主服务器和从服务器上。三台机器同时对外服务,解决读数据的负载均衡问题。 生产者数据插入修改只能在主服务器上执行。
同步占用很大的带宽。
Broker-Cluster多主集群同步部署方式
都是主服务器,可以进行相互之间的数据同步
不管是读还是写,都可以负载均衡
Broker-Cluster多主集群转发部署方式
不同的元数据存储在不同的broker上, 元数据的描述信息同步在各个broker上。
请求拉取broker-1上的某条数据时,broker-1上没有该数据,但是它知道broker-2上有这个数据,于是就转发到broker-2上。
Master-Slave和 Broker-Cluster结合
挂了数据不会丢失还可以用。
3.2.5高可靠
分布式消息中间件设计相关推荐
- 深入理解阿里分布式消息中间件
什么是分布式消息中间件 什么是分布式消息中间件? 对于分布式消息中间件,首先要了解两个基础的概念,即什么是分布式系统,什么又是中间件. 分布式系统: "A distributed syste ...
- 阿里P8架构师谈:分布式架构设计12精讲
分布式架构设计包含: 分布式缓存 分布式消息中间件 分库分表.读写分离 单点登录等 想成为阿里160万年薪的P8架构师?你必须掌握如下6大技能体系! 阿里P8架构师谈:分布式架构系统拆分原则.需求.微 ...
- 分布式消息中间件中的一些概念(接上一篇的《什么是分布式消息中间件?》)...
接上一篇的<什么是分布式消息中间件?>,这一篇来介绍一下消息中间件相关的一些概念和专业术语. Topic 主题,从逻辑上讲一个Topic就是一个Queue,即一个队列:从存储上讲,一个To ...
- 分布式消息中间件 MetaQ 作者庄晓丹专访
MetaQ(全称Metamorphosis)是一个高性能.高可用.可扩展的分布式消息中间件,思路起源于LinkedIn的Kafka,但并不是Kafka的一个Copy.MetaQ具有消息存储顺序写.吞吐 ...
- 基于spring boot的邮件微服务消息中间件设计与实现 毕业论文+系统功能图v1.0.vsdx+项目源码
下载地址:https://download.csdn.net/download/m0_63680064/36065411 项目介绍: 基于spring boot的邮件微服务消息中间件设计与实现 毕业论 ...
- 分布式架构设计概要总结
分布式架构概要总结 构建分布式的原因 业务架构的演进 在上图简单以时间线为准,粗略描述了我们系统架构随着业务的需求考量以及业务的发展,系统承担的并发量也将逐步提升,这就要求我们的系统架构需要开始思考如 ...
- 工行“去O”数据库选型与分布式架构设计
魏亚东 工商银行软件开发中心经理 中国工商银行软件开发中心三级经理,资深架构师.杭州研发部数据库专家牵头人和开发中心安全团队成员,负责技术管理.数据库和安全相关工作. 2009年加入中国工商银行软件开 ...
- 开源软件成熟度评测报告-分布式消息中间件
一.背景 随着互联网技术和金融科技的不断发展,从RPC到Web Service,从SOA的推行再到RESTful以及云计算中PaaS与SaaS的推广,分布式架构在金融企业中得到了广泛应用,消息中间件则 ...
- 如何实现高容量大并发数据库服务 | 数据库分布式架构设计
袋鼠学院和优云.阿里云联合举办的沙龙结束之后,总是有小伙伴们来问PPT内容,想要进一步了解Topic内容.(哦,对了对了,竟然还有小伙伴专门冲着袋鼠云去听沙龙,感动cry~~) 千呼万唤,忙成狗的袋鼠 ...
最新文章
- Task02:青少年软件编程(Scratch)等级考试模拟卷(一级)
- java 连接 pgsql
- Python定时任务调度——APScheduler
- 报错curl: (7) Failed to connect to 127.0.0.1 port xxxx: Connection refused
- RabbitMQ实现生产者发送消息异步confirm
- Java:Swing篇,实现JList、JTextArea的自动滚动,实时刷新功能
- Quay (3) - 访问权限管理
- 计算机应用0006作业2,〔计算机应用基本0006〕14秋在线作业2.doc
- 【学习OpenCV4】图像像素数据类型的转换与归一
- Xcode工程添加第三方文件的详细分析 Create folder references for any added folders
- HashSet和HashMap的区别 1
- IE、Firefox和 Chrome长时间打开后内存都会变很大。
- 计算机cpu天体图,电脑cpu天梯图2019|最新Intel/AMD处理器性能排行2019
- 我想加入阿里,我该怎么做
- Linux /usr、/usr/share、/etc介绍
- win10修改服务器时间,win10设置时间服务器地址
- saltstack return mysql_10-saltstack 数据返回到MySQL
- 5G通信基础知识学习
- Django学习笔记(五)
- 十五项搜索引擎优化技巧
热门文章
- Overloaded ‘operator>>‘ must be a binary operator (has 3 parameters)
- linux 标准输出 复制,使用LINUX dup2 复制文件描述符到标准输出STDOUT_FILENO
- python pdb调试方法
- js中使用createEvent和initEvent实现自定义事件
- 关于 海思平台sample的demo中添加ffmpeg静态库(.a)报错误undefined reference toavpriv_pix_fmt_hps_avi等错误 的解决方法
- 数据探索分析-EDA
- java毕业生设计电子商城系统计算机源码+系统+mysql+调试部署+lw
- 小程序 显示3个一排 自动换行
- spark 学习笔记
- CREE官网LED数据资料下载