1.常用的几种队列简介

RabbitMQ有五种常用的队列,分别是:简单队列、work模式、发布订阅模式、路由模式、主题(Topic)模式。其实发布订阅、路由、主题这三种模式都从属于与routingkey相关的模式,所以从性质上来说可以说是属于同一类。接下来,我们就以简述与代码的形式,来分别解释一下这几种模式。

2.相关名词解释

Publish:发布者(消息的生产方)

Consumer:使用者(消息的消耗方)

Exchange:交换机(消息的中转站)--后面与routingkey相关的模式会做出相应的解释

VirtrulHost:虚拟主机(在消息系统内开辟的一个放置或者是寄存队列的一个区域,相当于数据库概念)

Queue:消息队列(相当于数据库中的表)

Channel:通道(构建消费者与生产者消息沟通的渠道)

3.几种队列模式的简述及编码实现

(1)简单模式:

所谓简单模式就是由一个生产者、一个消费者,外加一个渠道构建的最为简单的生产消费模式。生产者通过渠道完成消息的推送,消费者接受消息并使用,如此简单。

eg. Client

//1.构建一个连接工厂

var factory = new ConnectionFactory() {

HostName="localhost",//主机名

Port=5672,   //端口号

VirtualHost="/lsh-blog",  //要使用的虚拟主机名

UserName="lsh",  //账号

Password="lsh"   //密码

};

Console.WriteLine("接下来要发10条消息。。。");

//2.构建一个连接

using (var connection = factory.CreateConnection())

{

//3。构建一个通道

using (var channel = connection.CreateModel())

{

channel.QueueDeclare("lko",false,false,false,null);

//推送消息

string msg = "我来发布一条最简单的消息";

//推送消息

channel.BasicPublish("",routingKey: "",

basicProperties: null,

body: Encoding.UTF8.GetBytes(msg));

}

}

Console.ReadKey();

Consumer:

/*

consumer

*/

Console.WriteLine("接收消息中。。。");

var factory = new ConnectionFactory()

{

HostName = "localhost",

Port = 5672,

VirtualHost = "/lsh-blog",

UserName = "lsh",

Password = "lsh",

};

using (var connection = factory.CreateConnection())

using (var channel = connection.CreateModel())

{

channel.QueueDeclare(queue: "lko",

durable: false,

exclusive: false,

autoDelete: true,

arguments: null);

var consumer = new EventingBasicConsumer(channel);

consumer.Received += (model, ea) =>

{

var body = ea.Body;

var message = Encoding.UTF8.GetString(body);

Console.WriteLine(" [Consumer] Received {0}", message);

Thread.Sleep(2000);

channel.BasicAck(ea.DeliveryTag, false);

};

channel.BasicConsume(queue: "lko",

noAck: false,

consumer: consumer);

Console.ReadLine();

(2)Work模式

由一个生产者、多个消费者以及驱动组成。RabbitMQ队列有一个消息竞争原则,就是同时消费同一条队列的几个消费者,对于队列的消息都是谁先获取就被谁消费,没有重复或者不被消费这一说。因而,该模式只是一种特性,所以就不用代码说明啦。

(3) 发布订阅模式

发布订阅就是生产方发布一个入口,使用方就可以接入这个入口,从而做到数据的流通。这样的话,所有的使用方都可以接入这个入口,从而得到数据信息。该模式所需要借助的,便是交换机(Exchange)这个概念,以交换机作为入口,消费使用者进行绑定接入。

eg. Publish

//1.构建一个连接工厂

var factory = new ConnectionFactory() {

HostName="localhost",//主机名

Port=5672,   //端口号

VirtualHost="/lsh-blog",  //要使用的虚拟主机名

UserName="lsh",  //账号

Password="lsh"   //密码

};

Console.WriteLine("接下来要发10条消息。。。");

//2.构建一个连接

using (var connection = factory.CreateConnection())

{

//3。构建一个通道

using (var channel = connection.CreateModel())

{

//定义交换机(fanout为交换机类型)

channel.ExchangeDeclare("search_direct", "fanout");

//推送消息

string msg = "我来发布一条最简单的消息";

//推送消息

channel.BasicPublish("search_direct", routingKey: "",

basicProperties: null,

body: Encoding.UTF8.GetBytes(msg));

}

}

Console.ReadKey();

Consumer:

/*

consumer

*/

Console.WriteLine("接收消息中。。。");

var factory = new ConnectionFactory()

{

HostName = "localhost",

Port = 5672,

VirtualHost = "/lsh-blog",

UserName = "lsh",

Password = "lsh",

};

using (var connection = factory.CreateConnection())

using (var channel = connection.CreateModel())

{

channel.QueueDeclare(queue: "lko",

durable: false,

exclusive: false,

autoDelete: true,

arguments: null);

//将队列lko与交换机search_direct进行绑定接入

channel.QueueBind("lko", "search_direct","");

var consumer = new EventingBasicConsumer(channel);

consumer.Received += (model, ea) =>

{

var body = ea.Body;

var message = Encoding.UTF8.GetString(body);

Console.WriteLine(" [Consumer] Received {0}", message);

Thread.Sleep(2000);

channel.BasicAck(ea.DeliveryTag, false);

};

channel.BasicConsume(queue: "lko",

noAck: false,

consumer: consumer);

Console.ReadLine();

(4) 路由模式

路由模式就是以交换机为开发接口,rotingkey作为唯一的过滤筛选标识来实现消息 的发布与使用。这样的话,消费者就可以只消费绑定当前交换机发过来的某一个或某一些rotingkey的消息进行选择性处理啦。发布方,我们只需在上面说过的发布订阅模式的交换及类型fanout改为direct(即:channel.ExchangeDeclare("search_direct", "fanout"), channel.BasicPublish("search_direct", routingKey: "",basicProperties: null,body: Encoding.UTF8.GetBytes(msg));),消费使用方绑定自己队列想要接收的某一些routngkey的消息即可(即: channel.QueueBind("lko", "search_direct","item.del");channel.QueueBind("lko", "search_direct","item.add");…).

(5)Topic话题模式

可以说是带有模糊匹配消费性质的路由模式,也就是说,发布方的交换机类型变成topic,其余的可以保持原封不变,而接收方可以消费一个消费区间或者也可以说是符合某条件的routingkey集合的进行消费使用(即:消费方channel.QueueBind("lko", "search_direct","item.#"),来匹配所有以item开头的所有roukingkey的消息进行消费使用)

4.总结

至此,RabbitMQ常用的几种消费队列模式就简单的介绍完啦,可能有不是很完善的介绍说明,还请诸位多多谅解,后期会不断的完善。下一篇,我将谈一下我所了解的RabbitMQ的使用场景及基于C#的RabbitMQ.dll客户端相关封装的一款组件—EasyNetMQ进行简单的使用分析,欢迎各位大佬指点批评~

消息队列--RabbitMQ(二)的更多相关文章

  1. (二)RabbitMQ消息队列-RabbitMQ消息队列架构与基本概念

    原文:(二)RabbitMQ消息队列-RabbitMQ消息队列架构与基本概念 没错我还是没有讲怎么安装和写一个HelloWord,不过快了,这一章我们先了解下RabbitMQ的基本概念. Rabbit ...

  2. ASP.NET Core消息队列RabbitMQ基础入门实战演练

    一.课程介绍 人生苦短,我用.NET Core!消息队列RabbitMQ大家相比都不陌生,本次分享课程阿笨将给大家分享一下在一般项目中99%都会用到的消息队列MQ的一个实战业务运用场景.本次分享课程不 ...

  3. nodejs操作消息队列RabbitMQ

    一. 什么是消息队列 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已.其主要用途:不同进程Process/ ...

  4. 消息队列rabbitmq的五种工作模式(go语言版本)

    前言:如果你对rabbitmq基本概念都不懂,可以移步此篇博文查阅消息队列RabbitMQ 一.单发单收 二.工作队列Work Queue 三.发布/订阅 Publish/Subscribe 四.路由 ...

  5. openstack (共享服务) 消息队列rabbitmq服务

    云计算openstack共享组件——消息队列rabbitmq(3)   一.MQ 全称为 Message Queue, 消息队列( MQ ) 是一种应用程序对应用程序的通信方法.应用程序通过读写出入队 ...

  6. C#中使用消息队列RabbitMQ

    在C#中使用消息队列RabbitMQ 2014-10-27 14:41 by qy1141, 745 阅读, 2 评论, 收藏, 编辑 1.什么是RabbitMQ.详见 http://www.rabb ...

  7. node使用消息队列RabbitMQ一

    基础发布和订阅 消息队列RabbitMQ使用 1 安装RabbitMQ服务器 安装erlang服务 下载地址 http://www.erlang.org/downloads 安装RabbitMQ 下载 ...

  8. 消息队列--RabbitMQ(一)

    1.消息队列概述 可以理解为保存消息的一个媒介/或者是个容器,与之相关有两个概念(即生产者(Publish)与消费者(Consumer)).所谓生产者,就是生产创造消息的一方,那么,消费者便是从队列中 ...

  9. (一)RabbitMQ消息队列-RabbitMQ的优劣势及产生背景

    原文:(一)RabbitMQ消息队列-RabbitMQ的优劣势及产生背景 本篇并没有直接讲到技术,例如没有先写个Helloword.我想在选择了解或者学习一门技术之前先要明白为什么要现在这个技术而不是 ...

随机推荐

  1. ELK的使用

    首先安装jdk,我这里使用open-jdk yum list all | grep jdk yum -y install java-1.8.0-openjdk-devel, java-1.8.0-op ...

  2. ConcurrentHashMap以及HashMap,HashTable的区别

    ConcurrentHashMap与HashMap,和HashTable 的区别? ConcurrentHashMap是一个线程安全的key-value数据结构,而HashMap不是.Concurre ...

  3. Alembic Migrations

    Introduction The migrations in the alembic/versions contain the changes needed to migrate from older ...

  4. 仿联想商城laravel实战---3、前端页面搭建(什么情况下需要路由接参数)

    仿联想商城laravel实战---3.前端页面搭建(什么情况下需要路由接参数) 一.总结 一句话总结: 比如访问课程的时候,不同的课程(比如云知梦),比如访问不同的商品,比如访问不同的分类 //商品详 ...

  5. 分享知识-快乐自己:Java中各种集合特点

    Java中各种集合特点: Collection[单列集合]: List(有序,可重复): ArrayList: 底层数据结构是数组,查询快,增删慢.线程不安全,效率高. Vector: 底层数据结构是 ...

  6. Selenium-几种元素定位方式

    #识别元素并操作#一般有如下几种方法,其中id最为常用.这里需要注意识别元素一定要用唯一id 1.find_element_by_id("value") #! /usr/bin/e ...

  7. 不要使用Android Studio的Git Commit了---->记一次debug

    今天下午写了一些代码,吃晚饭时分用Android Studio commit了一下,不知道有没有选择Commit and push,结果刚才代码出bug我想回滚到上个版本的时候,发现Android S ...

  8. 根据sid或sqlID查询SQL

    根据sid查询已经执行过的sql select sql_text from v$sqlarea a,v$session b where a.SQL_ID=b.PREV_SQL_ID and b.SID ...

  9. [IBM]掌握Ajax,Ajax中的高级请求和响应

    掌握 Ajax, Ajax 中的高级请求和响应 http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html http://www.ibm.c ...

  10. 洛谷 P4220 & UOJ #347 通道 —— 随机化

    题目:https://www.luogu.org/problemnew/show/P4220 http://uoj.ac/problem/347 先写了一下 n^2 和三棵树一样的情况,n^2 还写了 ...