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服务器的更多相关文章

  1. RabbitMQ (十) 远程过程调用(RPC)

    在远程计算机上运行一个函数并等待结果,我们通常叫这种模式为远程过程调用或者RPC. 通过 RabbitMQ 进行 RPC 很容易,客户端发送请求消息,服务器回复响应消息.为了接收响应,我们需要发送带有 ...

  2. 基于Netty打造RPC服务器设计经验谈

    自从在园子里,发表了两篇如何基于Netty构建RPC服务器的文章:谈谈如何使用Netty开发实现高性能的RPC服务器.Netty实现高性能RPC服务器优化篇之消息序列化 之后,收到了很多同行.园友们热 ...

  3. 分布式消息通信之RabbitMQ Tutorials

    目录 官网 1 Hello World! 1.1 生产者demo producer 1.2 消费者demo consumer 1.3 查看queue队列中的信息 页面查看,可看到有4条消息 命令查看 ...

  4. Netty实现高性能RPC服务器优化篇之消息序列化

    在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...

  5. RabbitMQ系列二(构建消息队列)

    从AMQP协议可以看出,MessageQueue.Exchange和Binding构成了AMQP协议的核心.下面我们就围绕这三个主要组件,从应用使用的角度全面的介绍如何利用RabbitMQ构建消息队列 ...

  6. 使用Vert.x构建Web服务器和消息系统

    如果你对Node.js感兴趣,Vert.x可能是你的下一个大事件:一个建立在JVM上一个类似的架构企业制度. 这一部分介绍Vert.x是通过两个动手的例子(基于Vert.x 2.0). 当Node.j ...

  7. 微服务实战(三):落地微服务架构到直销系统(构建基于RabbitMq的消息总线)

    从前面文章可以看出,消息总线是EDA(事件驱动架构)与微服务架构的核心部件,没有消息总线,就无法很好的实现微服务之间的解耦与通讯.通常我们可以利用现有成熟的消息代理产品或云平台提供的消息服务来构建自己 ...

  8. RabbitMQ详解(二)------消息通信的概念

    PS:近期在南宁出差,工作比较忙,所以更新会比较慢. 说到消息通信,可能我们首先会想到的是邮箱,QQ,微信,短信等等这些通信方式,这些通信方式都有发送者,接收者,还有一个中间存储离线消息的容器.但是这 ...

  9. RabbitMQ(二):理解消息通信RabbitMQ

    原文:RabbitMQ(二):理解消息通信RabbitMQ 一.消费者.生产者和信道 生产者(producer):生产者创建消息,然后发布(发送)到代理服务器(RabbitMQ),可以说发送消息的程序 ...

随机推荐

  1. Sublime Text 3安装emmet(ZenCoding)

    1.安装 Package Ctrol: 使用 ctrl + - 打开控制台,输入以下代码 import urllib.request,os; pf = 'Package Control.sublime ...

  2. LNMP支持 多版本PHP

    1.到 http://www.php.net/downloads.php(http://www.php.net/downloads.php) 选择合适的版本号,如 5.6.34 2.到 LNMP 1. ...

  3. Codeforces 845 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 A题 传送门 题意:2n2n2n个人下棋,分为两个阵营,每个阵营nnn个人,每个人有一个积分,积分高的能赢积分低的,问如果你可以随意选人,然 ...

  4. dremio jdbc使用

    驱动包地址 链接:https://pan.baidu.com/s/1Nivkvze24hRH8pXOQleCgw 提取码:gp9z 使用dremio主要原因 : 1)springboot提供了es组件 ...

  5. Toggle组件切换开关,控制开关图片显示与隐藏

    UGUI_Image 组件简单笔记 Rect Transform:用于控制 UI 物体的基本属性 Image 基本使用 1.Image 组件是用于显示图片资源的.使用方式有两种:1.显示纯粹的颜色:2 ...

  6. vs C++ scanf 不安全

    项目->属性-> c/c++->预处理器->预处理器定义->加入下面这句: _CRT_SECURE_NO_DEPRECATE

  7. HDU 6377 度度熊看球赛 (计数DP)

    度度熊看球赛 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  8. Unity3D编辑器扩展(一)——定义自己的菜单按钮

    Unity3D 引擎的编辑器拥有很强的扩展性,用的好可以帮我们省很多事情.在这里记录下如何去扩展 Unity3D 的编辑器,定制属于我们自己的开发环境. 本篇主要讲解在 Unity3D 引擎的各个窗口 ...

  9. python time库

    https://www.cnblogs.com/tkqasn/p/6001134.html

  10. wx 参数传值

    1: data-id 我们可以给HTML元素添加自定义的data-*属性 example:   假设页面里有下面的元素存在: <div id="myDiv" data-nam ...