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. linux 系统监控好文

    摘自: http://os.51cto.com/art/201005/200714_all.htm

  2. 分治思想求解X的M次幂方

    package main import ( "fmt" ) //递归形式分治求解 func power(x, m int) int { { } else { y := power( ...

  3. Spark- Transformation实战

    RDD的算子分为两类,是 Trans formation(Lazy),一类是 Action(触发任务执行RDD不存在真正要计算的数据,而是记录了RDD的转换关系(调用了什么方法,传入什么函数) RDD ...

  4. flex与js交互浅析

    1.flex调用js方法 调用方法例如:ExternalInterface.call("UploadComplete",oldName,uidName,_dir+"/&q ...

  5. jQuery 事件 - one() 方法

    jQuery 事件参考手册 实例 当点击 p 元素时,增加该元素的文本大小: $("p").one("click",function(){ $(this).an ...

  6. 05 - Django应用第二步

    知识点 1) 数据库的配置 涉及到INSTALL_APPS的配置等 初次创建数据的命令 2) 模型的编写 模型的创建方式, 写一个类继承自models.Model 模型的数据类型 外键 自动创建ID列 ...

  7. JavaWEB - JSP及隐含对象

    ---------------------------------------------------------------------------------------------------- ...

  8. CI中控制器名不能和本个 控制器中的方法名相同

    控制器名称:application/controllers/tang.php 控制器中方法名称:application/controllers/role.php  中有方法 public  funct ...

  9. windows下python使用虚拟环境

    官方文档: http://pythonguidecn.readthedocs.io/zh/latest/dev/virtualenvs.html virtualenv 是一个创建隔绝的Python环境 ...

  10. 使用Anthem.NET 1.5中的FileUpload控件实现Ajax方式的文件上传

    Anthem.NET刚刚发布了其最新的1.5版本,其中很不错的一个新功能就是对文件上传功能的Ajax实现.本文将简要介绍一下该功能的使用方法. Anthem.NET的下载与安装 Anthem.NET可 ...