目录

消息总线

Openstack 采用了面向服务的开发模式(有别于面向对象和面向过程),需要我们去考虑各个服务之间和各项目之间是如何传递消息的。

  • Restful API:项目之间的通信。
  • 消息总线:项目内部的服务之间的通信。

使用这种架构模式的好处在于:保证了各个项目对外提供服务的 API 接口可以被不同的客户端类型所调用。即,只要可以调用这个 API 接口,那么 Client 是使用什么技术来实现,Service 都不会受到影响,也不需要作出改变。Server 和 Client 做到了模块化的分离。除此之外,还能够保证项目内部通信接口的可扩展性和可靠性,可以支持大规模的部署

消息总线:可以实现一些服务向总线发送信息,其他的服务从总线上获取消息的效果。就类似于回转寿司的回转带,所有人都可以往回转带上寿司和寿司,这样的话只需要有足够的位置,就能够随时加入或减少客人,而且并不会影响整个寿司店的运作。

消息总线的原理

项目内部各服务进程之间的通信使用了:oslo.messaging库所提供的函数方法。同时还需要以下两种技术作为支撑。

  • 远程过程调用 RPC:一个服务进程可以调用其他远程服务进程的方法。调用的方式:

    • call():远程方法会被同步执行,调用者会被阻塞直到返回方法的结果,在一些调用时间较长的场合中使用会对效率又很大的影响。( call() 调用的远程服务的方法会被马上执行,在执行的过程中还会把调用者的进程阻塞掉,知道返回结果为止。)

    • cast():远程服务的方法会被异步执行,调用者不会被阻塞,结果也无须立即返回,可以在一个合适的时机(人为干预)去执行并返回结果。所以也要求调用者利用其他的方法来查询这次远程调用的结果。

  • 事件通知:某一个服务进程将事件通知发送到消息总线上,所有在消息总线上且对该事件通知感兴趣的服务进程都可以将该事件通知获取并进行处理,执行的结果并不需要返回给事件发送者。这种方式不仅可以在项目组件内部的进程服务通信间实现,还可以在项目之间的通信中实现(EG. Ceilometer)。

AMQP

AMQP高级消息队列协议:是一个基于应用层的,用于异步消息传递的协议规范。其功能包括了: 消息的导向/ 消息的队列/ 消息的路由/ 消息的可靠性/ 消息的安全性。不同的AMQP实现方式之间可以通过定义消息在网络上传输时的字节流格式来进行互相操作。

在一个实现了 AMQP协议 的中间件消息队列服务中,如:RabbitMQ。当由生产者发出的不同的消息被发送到 RabbitMQ Server 中的 Queue 时,RabbitMQ 会根据不同的条件把 Queue 中的请发传递给不同的消费者。如果消费者无法接收,那么这个消息,就会自动的把消息缓存在内存或者磁盘中。这些操作是由 RebbitMQ 中的 Exchange 和 Queue 来实现的( Exchange或Queue的数量不定 ):

  • Excange(信息交换):决定了消息的路由转发,根据接收到的消息中的 Info (从消息属性/消息头/消息体中提取)来与绑定表匹配(消息的 routing key 和 Queue 的 binding key 匹配)以此来决定将消息转发到哪一个 Queue 中,然后消费者再从 Queue 中获取消息并进行处理。

  • Queue(消息队列):作为 消息存储分发 实体,负责将消息缓存在内存或者磁盘中,并且按照一定的顺序将这些消息分发给一个或多个消费者。

:Excange 负责将消息转发到 Queue 中,转发的判断依据是从消息中获取的routing key 与 Queue 中的 binding key 匹配结果。

Openstack 中的消息总线 & AMQP的更多相关文章

  1. 记一次有关spark动态资源分配和消息总线的爬坑经历

    问题: 线上的spark thriftserver运行一段时间以后,ui的executor页面上显示大量的active task,但是从job页面看,并没有任务在跑.此外,由于在yarn mode下, ...

  2. JMS中的消息通信模型

    1. MQ简介: 消息队列(Message Queue,简称MQ),是应用程序与应用程序之间的一种通信方法.应用程序通过发送和检索出入列队的针对应用程序的数据 - 消息来通信,而无需专用连接来链接它们 ...

  3. 探索 OpenStack 之(14):OpenStack 中 RabbitMQ 的使用

    本文是 OpenStack 中的 RabbitMQ 使用研究 两部分中的第一部分,将介绍 RabbitMQ 的基本概念,即 RabbitMQ 是什么.第二部分将介绍其在 OpenStack 中的使用. ...

  4. 开源消息总线ActiveMQ

    一.消息中间件MOM(Message-Oriented Middleware) 消息中间件是解决异步分布式系统中通讯和排队问题的中间件技术.它利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数 ...

  5. springcloud(九):配置中心和消息总线(配置中心终结版)

    我们在springcloud(七):配置中心svn示例和refresh中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码发送请求来刷新客户端 ...

  6. SpringCloud学习系列之五-----配置中心(Config)和消息总线(Bus)完美使用版

    前言 在上篇中介绍了SpringCloud Config的使用,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的分布式配置中心( ...

  7. SpringCloud基于消息总线的配置中心

    @https://www.cnblogs.com/ityouknow/p/6931958.html Spring Cloud Bus Spring cloud bus通过轻量消息代理连接各个分布的节点 ...

  8. SpringCloud消息总线

    我们在springcloud(七):配置中心svn示例和refresh中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码发送请求来刷新客户端 ...

  9. springcloud 入门 9 (消息总线)

    Spring cloud bus: Spring cloud bus通过轻量消息代理连接各个分布的节点.这会用在广播状态的变化(例如配置变化)或者其他的消息指令.Spring bus的一个核心思想是通 ...

随机推荐

  1. memset函数及原补反码关系

    memset函数及原补反码关系 计算机存储的是补码 几组常用的memset函数初始化值 10000000 128 10000000 10000000 10000000 10000000 -213906 ...

  2. RabbitMQ(七)心跳控制 -- heartbeat

    https://blog.csdn.net/jiao_fuyou/article/details/23186407

  3. 数据访问层的基类BaseDALSQL

    using System; using System.Text; using System.Collections; using System.Data; using System.Data.Comm ...

  4. 33. 构建第一个job

    1.点击 New Item 2.Enter an item name 输入一个name,点击Freestyle project 3.我们可以输入一个描述,点击Advanced 4.勾选Use cust ...

  5. Leetcode_415字符串相加

    给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: ①num1 和num2 的长度都小于 5100.②num1 和num2 都只包含数字 0-9.③num1 和num2 都不 ...

  6. Windows XP 下如何使用Qt Creator中的Git版本控制功能

     原文地址:http://www.qtcn.org/bbs/simple/?t16960.html Qt Creator是针对Qt应用开发平台专门设计的IDE开发工具,集成了很多功能,分别有win ...

  7. jmeter 5 参数化

    文件: 文件编码 注意: 如果文件另存为utf-8,文件第一行头会带bom头(不可见字符),jmeter读取参数后,会把头读取到请求报文中,提示不存在该用户 什么是bom头? 在utf-8编码文件中B ...

  8. mysql 针对table的查看命令行

    1  desc t_help; 2 show create table t_help; 3  show table status like 't_help';

  9. leetcode.双指针.633平方数之和-Java

    1. 具体题目 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 + b^2 = c. 示例1: 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5 注 ...

  10. Python- 接口类-抽象类

    接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接 ...