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. java之路 定义个一初始值 取它 个位 十位 百位 千位。。的数值。

    class Demo{ public static void main(String[] args){ int i =2584; //do{ int g = i%10; int s = (i%100) ...

  2. Quartz的自定义插件

    quartz本身插件: LoggingJobHistoryPlugin,LoggingTriggerHistoryPlugin分别可以打印scheduler容器管理的所有triggers和jobDet ...

  3. supervisor简要使用说明

    安装方法(之一) pip install supervisor 主要组件 supervisord: 用于控制启用和退出子进程,记录子进程的标准输出和标准错误输出. supervisorctl: she ...

  4. 如何让div弄成可以输入文字

    如何让div弄成可以输入文字 加一个contenteditable="true"属性即可.   <!DOCTYPE html> <html lang=" ...

  5. Java中十六进制转换 Integer.toHexString()

    为了显示一个byte型的单字节十六进制(两位十六进制表示)的编码,请使用: Integer.toHexString((byteVar & 0x000000FF) | 0xFFFFFF00).s ...

  6. 关于Idea里设置Terminal为Git/bin/bash.exe中文乱码的问题的终极解决方案

    1.这里如果设置为Git/git-bash.exe确实不会乱码,但是每次点Idea里的Terminal都会弹出一个单独的terminal窗口而非在idea子窗口里出现: 2.因此需要设置为Git/bi ...

  7. redis_字符串对象

    Redis总共支持五种数据类型:string,hash,list,set及zset.这里介绍字符串类型的实现 首先了解字符串对象的结构 // redis对象内存分配,列出主要相关的属性 redisOb ...

  8. 基于接口的 InvocationHandler 动态代理(换种写法)

    InvocationHandler is the interface implemented by the invocation handler of a proxy instance. Each p ...

  9. (转)jira7.2安装、中文及破解

    转自:http://www.cnblogs.com/ilanni/p/6200875.html 本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanni ...

  10. 团队-Forward团队-团队一阶段互评

    团队名称:Forward团队 学号:2015035107105 得分:7 原因:知识欠缺,能够一边学一边做 学号:2015035107109 得分:6 原因:对我有很多帮助 学号:2015035107 ...