OpenStack设计与实现4——消息总线(AMQP)

LogicEchoMaster
• 阅读 3330

OpenStack设计与实现4——消息总线(AMQP)

Tips:文章为拜读@xingjiarong 后有感而做的分享,先对作者表示感谢,附原文地址:http://blog.csdn.net/xingjiarong

0. 引言

  • 在西方有一句谚语,叫做“Don’t Reinvent the Wheel!”。直译过来就是不要在重新发明轮子了。也就是说我们应该避免做一些重复性的工作,如果一个东西别人已经做过了,那么我们拿来直接用就行了,没有必要重新制作,这一点在软件开发里尤为突出。所以在OpenStack的开发中也借鉴了这一思想,OpenStack利用了大量的现有库,这加快了OpenStack的开发,使得开发人员可以集中精力研究难点。下面我们就来一起讨论一下OpenStack的通用技术。

1. 消息总线

  • OpenStack的设计原则:

    1. 项目之间通过RESTful API进行通信;

    2. 项目内部通过,不同服务进程之间通过消息总线进行通讯。

  • 这种设计思想保证了各个项目对外可以被不同类型的客户端接受,同时也保证了内部项目通信接口的可扩展性和可靠性,以支持大规模的部署。

  • 软件的开发经历了三个阶段,从最初的面向过程到面向对象,然后再到面向服务。在面向服务的软件开发中,我们需要考虑的就是如何保持各个服务之间的通信。这里OpenStack借鉴了计算机硬件总线的思想,引入了消息总线。一些服务向总线上发送消息,另一些服务从总线上获取获取消息。

  • OpenStack利用开源库实现了以下两种类型的用于在内部服务进行之间的通讯:

    1. 事件通知
      某个服务进程可以把事件通知发送到消息总线上,该消息总线上所有对此类事件感兴趣的服务进程,都可以获得此事件通知并进行进一步的处理,但是处理的结果不会返回给事件发送者。

    2. 远程过程调用(RPC)
      通过远程调用,一个服务进程可以调用其他远程服务进程的方法,并且有阻塞和非阻塞两种方式。

  • OpenStack已经支持了一些常见的消息总线,如下表。

名称 特点
RabbitMQ 实现了AMQP的消息中间件服务,支持多种协议网关和编程语言
Qpid Apache基金会下的顶层项目,实现了AMQP协议
ZeroMQ 开源的高性能异步消息库,可以在没有Server/Broker的情况下工作

2. AMQP的实现原理

  • OpenStack所支持的消息总线类型中(上表),大部分是基于AMQP(Advanced Message Queuing Protocol)的,AMQP是一个异步消息传递所使用的开放的应用层协议规范,主要包括了消息的导向、队列、路由、可靠性和安全性。下面我们来详细的学习一下AMQP的原理。
    OpenStack设计与实现4——消息总线(AMQP)

  • 如上图所示,AMQP的主要参与者有以下几个:

    1. Producer:消息的产生者

    2. Comsumer:消息的接收者

    3. Exchange:交换部件,根据消息的条件选择不同的消息接收者。

    4. Queue:消息队列,暂时缓存到达消费者的消息

    5. Server/Broker:实现了AMQP的中间件服务

  • 消息的传递过程:

    1. 产生
      生产者服务器进程产生消息,消息是由消息头和消息体组成的,消息头指定了消息的接收条件,即哪些接收者可以接收这条消息。

    2. 交换(路由)
      Exchange部件类似于网络中的路由器,负责将消息转发到合适的接收者那里。在Exchange有一张表格,类似于路由表。在这张表中存放了所有的Queue的binding key,binding key的作用就是表示这个queue可以接收那些类型的消息。同时每一个消息头中都携带着一个routing key,表示这条消息可以被那些Queue接收。当一条消息到达Exchange时,Exchange会遍历这张表格,如果一个Queue的bing key与消息的routing key相匹配,那么就将消息转发到这个Queue。Exchange与路由器一样,通过通配符也可以支持多播(组播)和广播。

    3. 缓存
      Queue是接收者的缓存部件,是为了防止消费者无法接收消息,或者接收消息的速度不够快时消息不会被新到的消息覆盖。Queue会把消息缓存在内存或磁盘上。

3. 基于AMQPRPC的实现原理

OpenStack设计与实现4——消息总线(AMQP)

  • 消息发送过程:

    1. 客户端发送一个请求消息给Exchange,指定routing key为”op_queue“,同时指明一个消息队列名用来获取响应,图中为“res_queue”。

    2. Exhange把此消息转发到消息队列op_queue。

    3. 消息队列op_queue把消息推送到服务端,服务端执行此RPC调用对应的任务。执行结束后,服务端把响应的结果发送给消息队列,指明routing key为”res_queue“。

    4. Exchange把此消息转发到消息队列res_queue。

    5. 客户端从消息队列res_queue中获取响应。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
4年前
Apache Synapse 远程代码执行漏洞(CVE
!(https://oscimg.oschina.net/oscnet/435fc4cde65d4aee9a2efca3080cb89e.png)0x00事件背景ApacheSynapse是一个简单、轻量级的高性能企业服务总线(ESB),它是在ApacheSoftwareFoun
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
4年前
Dubbo爆出严重漏洞!可导致网站被控制、数据泄露!附解决方案
http://dy.163.com/v2/article/detail/F5FPIFRU0511Q1AF.html  !(http://dingyue.ws.126.net/2020/0216/125ec4c4p00q5rcrs0019d200ig009qg00ig009q.png)  来源:华为云  原文地址:https://w
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这