一:简介

RabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。他遵循Mozilla Public License开源协议。采用 Erlang 实现的工业级的消息队列(MQ)服务器

RabbitMQ的官方站:http://www.rabbitmq.com/ 
     AMQP(高级消息队列协议) 是一个异步消息传递所使用的应用层协议规范,作为线路层协议,而不是API(例如JMS),AMQP 客户端能够无视消息的来源任意发送和接受信息。AMQP的原始用途只是为金融界提供一个可以彼此协作的消息协议,而现在的目标则是为通用消息队列架构提供通用构建工具。因此,面向消息的中间件 (MOM)系统,例如发布/订阅队列,没有作为基本元素实现。反而通过发送简化的AMQ实体,用户被赋予了构建例如这些实体的能力。这些实体也是规范的一 部分,形成了在线路层协议顶端的一个层级:AMQP模型。这个模型统一了消息模式,诸如之前提到的发布/订阅,队列,事务以及流数据,并且添加了额外的特性,例如更易于扩展,基于内容的路由。

1.下载Erlang

http://www.erlang.org/download.html

有32位与64位版本可供选择,根据个人需要下载相应版本,下载好后先安装Erlang

2.下载RabbitMQ服务器安装文件

http://www.rabbitmq.com/install-windows.html

安装好RabbitMQ服务器端环境后,RabbitMQ将会以服务的形式驻留在服务器上,默认是开启状态

.在 cmd 中指向 sbin 目录,并输入以下命令

rabbitmq-plugins enable rabbitmq_management

http://localhost:15672,在登陆界面输入用户名:guest,密码:guest,即可进入管理界面查看各种信息

二:RabbitMQ 示例

发送消息端

  class Program
{
static void Main(string[] args)
{
UserHelp mes =new UserHelp();
while (true)
{
var result = mes.GetUserMessage();
Console.WriteLine( result);
} }
}
 public string GetUserMessage()
{
try
{
var conFactory = new ConnectionFactory();
conFactory.HostName = "localhost";
conFactory.UserName = "wangdongsheng";
conFactory.Password = "";
conFactory.VirtualHost = "/"; using (var connect = conFactory.CreateConnection())
{
//rabbitmq服务端
using (var channel = connect.CreateModel())
{
//在MQ上定义一个持久化队列,如果名称相同不会重复创建
channel.QueueDeclare("TestQueue", true, false, false, null);
// //输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息
channel.BasicQos(, , false);
//在队列上定义一个消费者
var consumer = new QueueingBasicConsumer(channel);
//消费队列,并设置应答模式为程序主动应答
channel.BasicConsume("TestQueue", false, consumer);
while (true)
{
//阻塞函数,获取队列中的消息
var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
byte[] bytes = ea.Body;
string str = Encoding.UTF8.GetString(bytes);
var msg = JsonConvert.DeserializeObject<RequestMsg>(str);
//恢复确认
channel.BasicAck(ea.DeliveryTag, false);
return "接收的数据:"+"发送人-"+msg.Name+";发送内容-"+msg.Code;
} }
}
}
catch (Exception ex)
{
return ex.Message;
}
}
   public class RequestMsg
{
public string Name { get; set; }
public string Code { get; set; }
}

接收消息端

 class Program
{
private static void Main(string[] args)
{ SendHelp help=new SendHelp();
while (true)
{
Console.WriteLine("请输入内容:");
var write = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(write))
{
var result = help.SendMessage(write);
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine(result);
Console.ForegroundColor = ConsoleColor.White;
}
}
Console.ReadKey();
}
}
        public string SendMessage(string msg)
{
try
{
var conFactory = new ConnectionFactory();
conFactory.HostName = "localhost";
conFactory.UserName = "wangdongsheng";
conFactory.Password = "";
conFactory.VirtualHost = "/"; using (IConnection connect = conFactory.CreateConnection())
{
//rabbitmq服务端
using (var channel = connect.CreateModel())
{
//在MQ上定义一个持久化队列,如果名称相同不会重复创建
channel.QueueDeclare("TestQueue", true, false, false, null);
while (true)
{
var requetMsg = new RequestMsg();
requetMsg.Name = "东升";
requetMsg.Code = msg;
string jsonStr = JsonConvert.SerializeObject(requetMsg);
byte[] bytes = Encoding.UTF8.GetBytes(jsonStr);
IBasicProperties pro = channel.CreateBasicProperties();
pro.DeliveryMode = ;
channel.BasicPublish("", "TestQueue", pro, bytes);
return "发送消息成功:发送人-"+requetMsg.Name+";消息内容-" + requetMsg.Code;
}
}
}
}
catch (Exception ex)
{
return "发送的消息为:" + ex.Message;
}
}
.Server(broker): 接受客户端连接,实现AMQP消息队列和路由功能的进程。

.Virtual Host:其实是一个虚拟概念,类似于权限控制组,一个Virtual Host里面可以有若干个Exchange和Queue,但是权限控制的最小粒度是Virtual Host

.Exchange:接受生产者发送的消息,并根据Binding规则将消息路由给服务器中的队列。ExchangeType决定了Exchange路由消息的行为,例如,在RabbitMQ中,ExchangeType有direct、Fanout和Topic三种,不同类型的Exchange路由的行为是不一样的。

.Message Queue:消息队列,用于存储还未被消费者消费的消息。

.Message: 由Header和Body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、由哪个Message Queue接受、优先级是多少等。而Body是真正需要传输的APP数据。

.Binding:Binding联系了Exchange与Message Queue。Exchange在与多个Message Queue发生Binding后会生成一张路由表,路由表中存储着Message Queue所需消息的限制条件即Binding Key。当Exchange收到Message时会解析其Header得到Routing Key,Exchange根据Routing Key与Exchange Type将Message路由到Message Queue。Binding Key由Consumer在Binding Exchange与Message Queue时指定,而Routing Key由Producer发送Message时指定,两者的匹配方式由Exchange Type决定。 

.Connection:连接,对于RabbitMQ而言,其实就是一个位于客户端和Broker之间的TCP连接。

.Channel:信道,仅仅创建了客户端到Broker之间的连接后,客户端还是不能发送消息的。需要为每一个Connection创建Channel,AMQP协议规定只有通过Channel才能执行AMQP的命令。一个Connection可以包含多个Channel。之所以需要Channel,是因为TCP连接的建立和释放都是十分昂贵的,如果一个客户端每一个线程都需要与Broker交互,如果每一个线程都建立一个TCP连接,暂且不考虑TCP连接是否浪费,就算操作系统也无法承受每秒建立如此多的TCP连接。RabbitMQ建议客户端线程之间不要共用Channel,至少要保证共用Channel的线程发送消息必须是串行的,但是建议尽量共用Connection。

.Command:AMQP的命令,客户端通过Command完成与AMQP服务器的交互来实现自身的逻辑。例如在RabbitMQ中,客户端可以通过publish命令发送消息,txSelect开启一个事务,txCommit提交一个事务。

RabbitMQ 消息队列的更多相关文章

  1. RabbitMQ消息队列(一): Detailed Introduction 详细介绍

     http://blog.csdn.net/anzhsoft/article/details/19563091 RabbitMQ消息队列(一): Detailed Introduction 详细介绍 ...

  2. RabbitMQ消息队列1: Detailed Introduction 详细介绍

    1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有 ...

  3. (转)RabbitMQ消息队列(九):Publisher的消息确认机制

    在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...

  4. (转)RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)

    在云计算环境中,很多时候需要用它其他机器的计算资源,我们有可能会在接收到Message进行处理时,会把一部分计算任务分配到其他节点来完成.那么,RabbitMQ如何使用RPC呢?在本篇文章中,我们将会 ...

  5. (转)RabbitMQ消息队列(六):使用主题进行消息分发

    在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统.Consumer可以监听不同severity的log.但是,这也是它之所以叫做简单日志系统的原因, ...

  6. (转)RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)

    上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...

  7. RabbitMQ消息队列应用

    RabbitMQ消息队列应用 消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景.本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理:二是 ...

  8. RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)

    上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...

  9. RabbitMQ消息队列(九):Publisher的消息确认机制

    在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...

  10. 使用EasyNetQ组件操作RabbitMQ消息队列服务

    RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...

随机推荐

  1. 【C++学习笔记1】

    几个比较容易忘记的东西....... 移动构造函数: Vector(Vector &&copy) //移动构造函数 { if(copy.A!=NULL) { A=copy.A; cop ...

  2. 关于常用meta的总结

    入行也半年了,无数次的想过写博客也无数次的想过第一篇会写什么,一直没有落实.今天心血来潮把博客开了,那就写点东西吧.第一篇就写一写看似简单但又经常不注意到的meta标签吧.(博主经验尚浅,有许多理解不 ...

  3. Spring学习之切入点表达式

    链接地址:http://jinnianshilongnian.iteye.com/blog/1415606

  4. com.sun.jdi.InvocationException occurred invoking method.

    文章来源于网络, 自己也遇到同样的问题,也是采用这样的方式解决的.原文链接http://zuiyanwangyue.iteye.com/blog/470638 在 HibernateDaoSuppor ...

  5. ubuntu mysql编码设置5.5以后

    安装了mysql. 版本:5.5.28 操作系统 :ubuntu 12.10 mysql> show variables like 'character%'; +---------------- ...

  6. [转载] 高大上的 CSS 效果:Shape Blobbing

    这篇大部分是转载,来自<高大上的 CSS 效果:Shape Blobbing>和 <Shape Blobbing in CSS> 有部分是自己理解和整理,配合效果要做出 app ...

  7. 嵌入式程序员应知道的0x10个基本问题

     来源:网络 嵌入式程序员应知道的0x10个基本问题 1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 ...

  8. Constructor Prototype Pattern 原型模式(PHP示例)

    当一个类大部分都是相同的只有部分是不同的时候,如果需要大量这个类的对象,每次都重复实例化那些相同的部分是开销很大的,而如果clone之前建立对象的那些相同的部分,就可以节约开销. 针对php的一种实现 ...

  9. Oracle EBS-SQL (PO-8):检查有供货比例无采购员.sql

    select distinct msr.sourcing_rule_name            名称 , msi.description                          说明 , ...

  10. 【自学php】第三天 - 读写文件

    这次的例子是把订单的数据保存起来,一般是用数据库来进行数据的存储最好,但是今天目的是为了学习读写文件,所以这次把数据存在文件里. 读写文件有一般有三个步骤: 1)打开文件.如果文件不存在,需要先创建它 ...