1、什么是RabbitMQ。详见 http://www.rabbitmq.com/

作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作,放入队列,再由另外一个线程,去异步处理这些队列,可极大的提高系统的并发能力。

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有MSMQ,ActiveMQ,RabbitMQ,IBM WEBSPHERE MQ 等等。

RabbitMQ是使用Erlang开发的,开源的,一个在高级消息队列协议(AMQP)基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License开源协议

RabbitMQ支持你能想到的大多数开发语言如Java,Ruby,Python,.Net,C/C++,Erlang等等。各种语言的客户端你可以从它的官方网站上下载。

2. RabbitMQ的特点

相比较于其他一些MQ产品,RabbitMQ的一些优势还是比较明显。

你可以在下面一些链接中找到一些比较

RabbitMQ,ActiveMQ,qpid:http://bhavin.directi.com/rabbitmq-vs-apache-activemq-vs-apache-qpid/

RabbitMQ和ZeroMQ:http://stackoverflow.com/questions/731233/activemq-or-rabbitmq-or-zeromq-or

还有四款消息队列大比拼:http://www.oschina.net/news/17973/message-queue-shootout

RabbitMQ的一些优点

    安装部署方便:

RabbitMQ安装方便,有详细的安装文档。

    可靠性:

RabbitMQ 提供了多种多样的特性让你在可靠性,可用性和性能之间作出权衡,包括持久化,发送应答,发布确认等。

    强大地路由功能:

所有的消息都会通过路由器转发到各个消息队列中,RabbitMQ内建了几个常用的路由器,并且可以通过路由器的组合以及自定义路由器插件来完成复杂的路由功能。

    Clustering:

RabbitMQ服务端可以在一个局域网中集群部署,作为一个逻辑服务器。

    Federation:

Federration模式可以让RabbitMQ服务器热备部署,当系统中其中一个服务器失效而无法运作时,另一个服务器即可自动接手原失效系统所执行的工作。

    Completing Consumer:

内置的竞争的消费者模式可以实现消费者的负载均衡。

   管理工具:

RabbitMQ提供了一个简单易用的管理界面,让用户可以通过浏览器监控和控制你的消息队列的方方面面。

   跟踪:

如果你在使用RabbitMQ过程中出现了问题,或者得到了你不期望的结果,你可以通过打开内置Tracer功能进行跟踪,当然这时性能就有所下降。

   插件系统:

提供了强大地插件系统,让用户能够方便的对MQ进行扩展。上面所说到的管理工具和Federation组件都是作为一个插件发布的。你可以选择安装或者不安装。

   客户端支持:

RabbitMQ支持你能想到的大多数开发语言如Java,Ruby,Python,.Net,C/C++,Erlang等等。

   强大的社区和商业支持:

强大的社区可以帮助你快速的解决关于RabbitMQ的各种问题,如果还是不能解决你的问题,VMWare还提供商业技术支持。

3、安装

RabbitMQ服务:http://www.rabbitmq.com/download.html
    (安装完RabbitMQ服务后,会在Windows服务中看到。如果没有Erlang运行环境,在安装过程中会提醒先安装Erlang环境。http://www.erlang.org/downloads)

.net客户端类库:http://www.rabbitmq.com/dotnet.html

4、插件

RabbitMQ提供了很多好用的插件,最常用的就是web管理工具,启动此插件。

CMD中运行命令:rabbitmq-plugins enable rabbitmq_management

注:rabbitmq-plugins 所在路径为:D:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.9\plugins

web管理工具的地址是:http://localhost:15672,初始用户名:guest 初始密码:guest

5. RabbitMQ的一些概念

- 连接(Connection),与RabbitMQ Server建立的一个连接,由ConnectionFactory创建,每个connection只与一个物理的Server进行连接,此连接是基于Socket进行连接的,这个可以相似的理解为像一个DB Connection。AMQP一般使用TCP链接来保证消息传输的可靠性。

- 通道 (Channel),在C#客户端里应该是叫Model,不明白为什么这么取名字,其他客户端基本都叫Channel。建立在Connection基础上的一个通道,相对于Connection来说,它是轻量级的。它就像是Hibernate里面的Session一样。Channel 主要进行相关定义,发送消息,获取消息,事务处理等。Channel可以在多线程中使用,但是在必须保证任何时候只有一个线程执行命令。一个Connection可以有多个Channel。客户端程序有时候会是一个多线程程序,每一个线程都想要和RabbitMQ进行连接,但是又不想共享一个连接,这种需求还是比较普遍的。因为一个Connection就是一个TCP链接,RabbitMQ在设计的时候不希望与每一个客户端保持多个TCP连接,但这确实是有些客户端的需求,所以在设计中引入了Channel的概念,每一个Channel之间没有任何联系,是完全分离的。多个Channel来共享一个Connection。

- 交换器(Exchange),它是发送消息的实体。

- 队列(Queue),这是接收消息的实体。

- 绑定器(Bind),将交换器和队列连接起来,并且封装消息的路由信息。

6、配置

配置文件地址为:C:\Documents and Settings\Administrator\Application Data\RabbitMQ\rabbitmq.config,默认没有rabbit.config文件,需要手工新建(默认会有rabbitmq.config.example 作为参考)。基于安全,做了两个配置,如下:

[
{rabbit,
[
{loopback_users, [<<"guest">>]},
{tcp_listeners, [{"127.0.0.1", 1234},
{"10.121.1.48", 8009}]} ]}
].

loopback_users:设置只能在与RabbitMq服务同一台机器上访问服务的用户。

tcp_listeners:设置RabbitMQ监听的IP地址与端口。只监听局域网内网iP、修改默认端口,防止被入侵攻击。

设置完后,别忘记了以下操作,否则配置不起作用。

  • 停止RabbitMQ服务;
  • 重新安装服务使配置生效:rabbitmq-service.bat install

此命令要切换到路径:D:\Program Files\RabbitMQ Server\rabbitmq_server-3.4.0\sbin

  • 启动RabbitMQ服务;

6、Demo练习。

消息生产者:

class Program
{
static void Main(string[] args)
{
try
{
ConnectionFactory factory = new ConnectionFactory();
factory.HostName = Constants.MqHost;
factory.Port = Constants.MqPort;
factory.UserName = Constants.MqUserName;
factory.Password = Constants.MqPwd;
using (IConnection conn = factory.CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
//在MQ上定义一个持久化队列,如果名称相同不会重复创建
channel.QueueDeclare("MyFirstQueue", true, false, false, null);
while (true)
{
string customStr = Console.ReadLine();
RequestMsg requestMsg = new RequestMsg();
requestMsg.Name = string.Format("Name_{0}", customStr);
requestMsg.Code = string.Format("Code_{0}", customStr);
string jsonStr = JsonConvert.SerializeObject(requestMsg);
byte[] bytes = Encoding.UTF8.GetBytes(jsonStr); //设置消息持久化
IBasicProperties properties = channel.CreateBasicProperties();
properties.DeliveryMode = 2;
channel.BasicPublish("", "MyFirstQueue", properties, bytes); //channel.BasicPublish("", "MyFirstQueue", null, bytes); Console.WriteLine("消息已发送:" + requestMsg.ToString());
}
}
}
}
catch (Exception e1)
{
Console.WriteLine(e1.ToString());
}
Console.ReadLine();
}
}
 
class Program
{
static void Main(string[] args)
{
try
{
ConnectionFactory factory = new ConnectionFactory();
factory.HostName = Constants.MqHost;
factory.Port = Constants.MqPort;
factory.UserName = Constants.MqUserName;
factory.Password = Constants.MqPwd;
using (IConnection conn = factory.CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
//在MQ上定义一个持久化队列,如果名称相同不会重复创建
channel.QueueDeclare("MyFirstQueue", true, false, false, null); //输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息
channel.BasicQos(0, 1, false); Console.WriteLine("Listening..."); //在队列上定义一个消费者
QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
//消费队列,并设置应答模式为程序主动应答
channel.BasicConsume("MyFirstQueue", false, consumer); while (true)
{
//阻塞函数,获取队列中的消息
BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
byte[] bytes = ea.Body;
string str = Encoding.UTF8.GetString(bytes);
RequestMsg msg = JsonConvert.DeserializeObject<RequestMsg>(str);
Console.WriteLine("HandleMsg:" + msg.ToString());
//回复确认
channel.BasicAck(ea.DeliveryTag, false);
}
}
}
}
catch (Exception e1)
{
Console.WriteLine(e1.ToString());
}
Console.ReadLine();
}
}
 


     

这是个人的总结,只是简单的安装和使用,积累了更好的经验在记录下来。

天下国家,可均也;爵禄,可辞也;白刃,可蹈也;中庸不可能也

二、消息队列之如何在C#中使用RabbitMQ(转载)的更多相关文章

  1. 二、消息队列之如何在C#中使用RabbitMQ

    1.什么是RabbitMQ.详见 http://www.rabbitmq.com/. 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作,放入队列,再由另外一个线程,去异步处理这 ...

  2. Linux进程间通信(二) - 消息队列

    消息队列 消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据. 消息队列和之前讨论过的管道和FIFO有很大的区别,主要有以下两点(管道请查阅我的另一篇文章 ...

  3. RabbitMQ消息队列系列教程(一)认识RabbitMQ

    摘要 RabbitMQ是最为流行的消息中间件,是处理高并发业务的利器.本系列教程,将跟大家一起学习RabbitMQ. 目录 RabbitMQ是什么? RabbitMQ的特点是什么? 一.RabbitM ...

  4. Rabbitmq消息队列(一) centos下安装rabbitmq

    1.简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的 ...

  5. 没用过消息队列?一文带你体验RabbitMQ收发消息

    人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 先给大家说声抱歉,最近一周都没有发文,有一些比较要紧重要的事需要处理. 今天正好得空,本来说准备写SpringIOC相关的东西,但是发现想 ...

  6. SpringBoot日记——MQ消息队列整合(二)

    基于第一篇文章搭建好环境以后,我们这篇文章继续介绍如何在springboot中使用RabbitMQ. 1).单播:添加好pom文件和自定义配置后,来看: @Autowired RabbitTempla ...

  7. 单点登录与消息队列以及在J2EE中的实现方案

    前言 这次为大家简单介绍两个在WEB开发中经常使用的概念——单点登录和消息队列以及具体到J2EE中的一些实现方案.本文原创性的工作比较少,主要是一些总结概括和自己的理解. 单点登录SSO SSO的业务 ...

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

    1.常用的几种队列简介 RabbitMQ有五种常用的队列,分别是:简单队列.work模式.发布订阅模式.路由模式.主题(Topic)模式.其实发布订阅.路由.主题这三种模式都从属于与routingke ...

  9. GaussDB(DWS)中共享消息队列实现的三大功能

    摘要:本文将详细介绍GaussDB(DWS)中共享消息队列的实现. 本文分享自华为云社区<GaussDB(DWS)CBB组件之共享消息队列介绍>,作者:疯狂朔朔. 1)共享消息队列是什么? ...

随机推荐

  1. SCCM2012 R2实战系列之七:软件分发(exe)

    在上一章节中,我们完成了SCCM 2012客户端代理软件的安装,现在就可以为客户端来部署应用程序了. SCCM2012增加了应用程序分发,同时保留了SCCM 2007里的包分发.应用程序分发可以直接对 ...

  2. C# 委托在线程与UI界面之间的应用

    前景:我们在使用线程的时候,经常会想要访问到Form窗体的控件,也就是线程与UI界面交互,但是他们隶属于连个不同的线程,所以是不能直接访问的,这个时候我们就可以通过委托来实现.打个比方,你想要给远方的 ...

  3. 腾讯微信被怼,iOS版微信不能打赏了

    2017年4月19日,估计很多有着大量粉丝的微信自媒体作者会感到很不爽,因为他们的苹果粉丝再也无法很爽快地.肆意.任性地打赏他们了,按目前iphone手机的占有率,估计打赏率会掉一半以上. 据微信派微 ...

  4. Windows 2016 无域故障转移群集部署方法 超详细图文教程 (二)

    上一章我们配置了一台设备,接着根据那个配置,配置其它设备.这里我配置了三台设备: 创建故障转移群集,并添加设备. 之前的操作都是每台服务器都要做的,而这个操作,只需要任选一台去做即可,我这里选d1 1 ...

  5. ubuntu 16.04 配置静态ip 后默认的网卡eno1变成eth0了不能联网的问题解决

    我这次是在真实机器上面安装的ubuntu16.04 在配置了静态ip后不懂什么原因默认的eno1网卡变回了eth0网卡之后就不能上网, 同一个网段的其他集群节点也不能ping 通 因为ubuntu16 ...

  6. tkinter简单使用

    第一个运行程序 # -*- coding: utf-8 -*- import tkinter as tk //引入 root = tk.Tk() // 实例化root T大写k小写 root.titl ...

  7. Error running app: Default Activity not found ; 安卓程序运行不了,也不报错。

    我最近copy一个工程,写完了去运行时不能运行,项目不报错,就是运行的地方有个叉号:尝试很多办法后准备重新New一个时发现:"10:17 Error running app: Default ...

  8. ES6的学习记录

    1.let命令: 基本用法: ES6新增了let命令,用来声明变量.用法类似于var,但是所声明的变量只在let命令所在的代码块内有效. { let a = 10; var b = 1; } cons ...

  9. angularjs中阻止事件冒泡,以及指令的注意点

    appModule.directive('newStr',function(){ return{ restrict:'AE', //阻止事件冒泡需要加$event参数 template:`<di ...

  10. lunix nginx安装 报错页面 状态码

    web服务器软件IIS  (windows底下的web服务器软件) Nginx (Linux底下新一代高性能的web服务器)  Tengine   www.taobao.com  这是淘宝 Apach ...