1、消息投递服务
RabbitMQ是一种消息投递服务,怎么理解这句话呢?即RabbitMQ即不是消息的生产者,也是消息的消费者.他就像现实生活中快递模式,消费者在电商网站上下单买了一件商品,此时对应的生产者(商家)则生产了一件货物(概念上的生产,可能已经生产好了),接着生产者(商家)将货物发送给快递公司,因为消费者下单了这个货物,相当于订阅了这件货物,所以快递公司将会把这件货物发送给对应的消费者.RabbitMQ就相当于这里面的快递公司.服务在生产者和消费者之间建立桥梁,即通信.
2、RabbitMQ的实现消息投递的方式
生产者创建消息(包含消息的(有效载荷-即有效的信息,注:他不会关心消息的内容)和(标签-发送给哪个消费者,注:RabbitMQ会根据标签吧消息发送给感兴趣的对方)),发布到对应的代理服务器.具体流程图如下
但是,上面的图并不是非常准确,因为消费者并不会订阅其中的某一条消息,消费者连接到代理服务器,且他只会订阅一个消息队列,当生产者向消费者所订阅的消息队列上发送数据时,那么消费者会接收到该队列的数据.
且在RabbitMQ在消息路由的过程中,消息的标签并没有随有效载荷一同传递,除非生产者在消息的有效载荷中显示指定了消息的实际生产者,所以正常情况下,RabbitMQ并不会告诉消费者谁生产了这个消息.
3、信道
(1)、传统TCP连接RabbitMQ存在的问题
在使用RabbitMQ生产消息或者消费消息时,应用程序必须连接到RabbitMQ,所以通常情况下,你需要建立一个TCP连接,向数据库一样,但是建立TCP连接的代价是很大的,这也说明了为什么在使用SqlClient或者其他数据库操作类库时,使用IDbConnection后,必须释放的原因.且操作系统每秒创建TCP连接的数量有限.如果你知道套接字这个坑的话.所以高峰期使用线程去创建RabbitMQ连接,显然存在性能瓶颈.
(2)、为什么要使用信道
为了解决(1)中的问题,RabbitMQ采用了信道的概念,即所有应用程序线程共用一个TCP连接,连接到RabbitMQ,线程调用RabbitMQ发布或者消费消息时,会在现有的TCP连接上创建一个信道,完成余下的操作.因为你可以每秒成千上万的创建信道而不会影响操作系统.同时你可以试试每秒成千上万的创建数据库连接,对比试试.
注:TCP连接和信道时包含关系,即TCP连接包含信道.在一条TCP连接上创建信道是没有限制的
4、使用RabbitMQ搭建RPC服务器
本系列文章跳过了RabbitMQ基础部分的介绍,直接进入RabbitMQ的RPC服务器构建,因为网上关于基础RabbitMQ的使用已经有很多,可以自行百度,关于基础(队列、交换机、信道等概念)可以参考https://www.cnblogs.com/stulzq/p/7551819.html,写的很好.下面进入正题.
.Net RabbitMQ之消息通信 构建RPC服务器的更多相关文章
-
RabbitMQ (十) 远程过程调用(RPC)
在远程计算机上运行一个函数并等待结果,我们通常叫这种模式为远程过程调用或者RPC. 通过 RabbitMQ 进行 RPC 很容易,客户端发送请求消息,服务器回复响应消息.为了接收响应,我们需要发送带有 ...
-
基于Netty打造RPC服务器设计经验谈
自从在园子里,发表了两篇如何基于Netty构建RPC服务器的文章:谈谈如何使用Netty开发实现高性能的RPC服务器.Netty实现高性能RPC服务器优化篇之消息序列化 之后,收到了很多同行.园友们热 ...
-
分布式消息通信之RabbitMQ Tutorials
目录 官网 1 Hello World! 1.1 生产者demo producer 1.2 消费者demo consumer 1.3 查看queue队列中的信息 页面查看,可看到有4条消息 命令查看 ...
-
Netty实现高性能RPC服务器优化篇之消息序列化
在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...
-
RabbitMQ系列二(构建消息队列)
从AMQP协议可以看出,MessageQueue.Exchange和Binding构成了AMQP协议的核心.下面我们就围绕这三个主要组件,从应用使用的角度全面的介绍如何利用RabbitMQ构建消息队列 ...
-
使用Vert.x构建Web服务器和消息系统
如果你对Node.js感兴趣,Vert.x可能是你的下一个大事件:一个建立在JVM上一个类似的架构企业制度. 这一部分介绍Vert.x是通过两个动手的例子(基于Vert.x 2.0). 当Node.j ...
-
微服务实战(三):落地微服务架构到直销系统(构建基于RabbitMq的消息总线)
从前面文章可以看出,消息总线是EDA(事件驱动架构)与微服务架构的核心部件,没有消息总线,就无法很好的实现微服务之间的解耦与通讯.通常我们可以利用现有成熟的消息代理产品或云平台提供的消息服务来构建自己 ...
-
RabbitMQ详解(二)------消息通信的概念
PS:近期在南宁出差,工作比较忙,所以更新会比较慢. 说到消息通信,可能我们首先会想到的是邮箱,QQ,微信,短信等等这些通信方式,这些通信方式都有发送者,接收者,还有一个中间存储离线消息的容器.但是这 ...
-
RabbitMQ(二):理解消息通信RabbitMQ
原文:RabbitMQ(二):理解消息通信RabbitMQ 一.消费者.生产者和信道 生产者(producer):生产者创建消息,然后发布(发送)到代理服务器(RabbitMQ),可以说发送消息的程序 ...
随机推荐
-
高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
-
《Invert》开发日志04:工具、资源和服务
这篇记录一下<Invert>用到的工具.资源和服务.秉承两个原则:一,绝不侵犯版权:二,尽量节省开支. 首先是工具.游戏引擎使用免费的Unity个人版: 编码IDE使用免费的VisualS ...
-
C#中协变与抗变(逆变)
泛型在.NET 2.0中正式的引入.在使用泛型的过程中,联系上面向对象的继承性.往往很容易想当然敲出类似以下代码 List<Animal> animalLst=new List<Do ...
-
Vim指令备忘
从网上找来的记忆图,适合于刚上手的童鞋形象记忆. 接下来的是个人在使用过程中容易忘记的命令,特此备份查看. n<space> 会向右移动这一行的n 个字元 n<Enter> 向 ...
-
HDU 1213 How Many Tables(并查集)
传送门 Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Igna ...
-
LR学习笔记---参数设置 (转 温故而知新)
LR在录制程序运行的过程中,VuGen(脚本生成器) 自动生成了包含录制过程中实际用到的数值的脚本,如果你企图在录制的脚本中使用不同的数值执行脚本的活动(如查询.提交等等),那么你必须用参数值取代录制 ...
-
varnish4.0简介
Varnish 4.0 简介 Varnish 是一款开源的HTTP加速器和反向代理服务器,它的主要特点有: (1)是基于内存缓存,重启后数据将消失.(2)利用虚拟内存方式,io性能好.(3)支持设置0 ...
-
从零开始PHP攻略(2)——操作符与迭代整理
目录: 10.操作符整理 11.表单计算代码 12.优先级与结合性 13.可变函数 14.条件判断 15.循环迭代 16.跳出控制 17.可替换的控制结构 10.操作符 10.1 算术操作符 算术操作 ...
-
ios -几种常见定时器
转自cocoachina 网友分享: http://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&mid=206637839&idx=7& ...
-
Java基础知识强化之IO流笔记81:NIO之 DatagramChannel
1. Java NIO中的DatagramChannel是一个能收发UDP包的通道.因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入.它发送和接收的是数据包. 2. DatagramCh ...