消息队列RabbitMQ

消息队列RabbitMQ

一、RabbitMQ是什么?

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

二、消息队列的特性

解耦:消息的生产者与消费者均基于AMQP协议(相同的接口与规范)进行发送与接收消息,互相不存依赖;

冗余:消息只有处理了才会被删除,除非明确允许多个消费者可以收到同一消息的多个副本,否则每个消息只会被单个消费者接收并处理;

扩展性:可增加或减少多个消息的生产者与消费者,两者的改动均不会影响到双方;

灵活性 & 峰值处理能力:因为有良好的扩展性,所以可视服务器的处理情况【可称为:消费者】(比如:高并发负载过大)动态的增减服务器,以提提高处理能力(可称为:负载均衡);

可恢复性:消息的生产者与消费者不论哪一方出现问题,均不会影响消息的正常发出与接收(当然单一的生产者与消费者除外,如果是这样也就没有必要使用分布式消息队列);

送达保证:只有消息被确认成功处理后才会被删除,否则会重新分发给其它的消费者进行处理,直到确认处理成功为止;

排序保证:先进先出是队列的基本特性;

缓冲:同一时间有多个消息进入消息队列,但是同一时间可以指定一个多个消息被消息者接收并处理,其余的消息处理等待状态,这样可以降低服务器的压力,起到缓冲的作用;

理解数据流:传递的消息内容以字节数组为主,但可以将对象序列化后成字节数组,然后在消费者接收到消息后,可反序列化成对象并进行相关的处理,应用场景:CQRS;

异步通信:允许将一个或多个消息放入消息队列,但并不立即处理它,而是在恰当的时候再去由一个或多个消费者分别接收并处理它们;

以上是我的个人理解,也可参看《使用消息队列的 10 个理由

应用场景:针对高并发且无需立即返回处理结果的时候,可以考虑使用消息队列,如果处理需要立即返回结果则不适合;

三、RabbitMQ环境的安装

1.服务器端:

A.需要先安装Erlang环境,下载地址:http://www.erlang.org/download.html,可能有时无法正常访问,可以通过VPN代理来访问该网站或在其它网站上下载(比如:CSDN)

B.安装RabbitMQ Server(有针对多个操作系统的下载,我这边以WINDOWS平台为主),下载地址:http://www.rabbitmq.com/download.html

说明:最新版的Erlang及abbitMQ Server安装后,一般WINDOWS环境变量及服务均都已正常安装与并正常启动,可不是最新版或没有安装好,则可执行以下命令:

Setx ERLANG_HOME “C:\Program Files\erl7.1″ -Erlang的-安装目录,也可通过系统属性-->高级-->环境变量来手动设置;

cd C:\Program Files (x86)\RabbitMQ Server\rabbitmq_server-3.5.6\sbin --切换到RabbitMQ Server的sbin目录下,然后执行如下命令:

rabbitmq-service install
rabbitmq-service enable
rabbitmq-service start

安装并设置OK后,可以通过:rabbitmqctl status查看运行情况、rabbitmqctl list_users查看当前用户、以下命令增加一个新用户:

rabbitmqctl add_user username password
rabbitmqctl set_permissions username ".*" ".*" ".*"
rabbitmqctl set_user_tags username administrator

修改密码:rabbitmqctl change_password username newpassowrd

删除指定的用户:rabbitmqctl delete_user username

列出所有queue:rabbitmqctl list_queues

列出指定queue的信息:rabbitmqctl list_queues [the queue name] messages_ready messages_unacknowledged

列出所有exchange:rabbitmqctl list_exchanges

列出所有binding:rabbitmqctl list_bindings

安装基于web的管理插件:rabbitmq-plugins.bat enable rabbitmq_management

当然还有其它的命令,大家可以去查看官网及其它资料,但我认为知道以上的命令足够用了

四、RabbitMQ的基本用法

使用RabbitMQ客户端就必需在项目中引用其相关的组件,这里可以通过NuGet安装或从官网下载再引用均可,方法很简单,不再重述;

1.普通用法:采用默认的exchange(交换机,或称路由器)+默认的exchange类型:direct+noAck(自动应答,接收就应答)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

/// <summary>

/// 消息发送者,一般用在客户端

/// </summary>

class RabbitMQPublish

{

    static void Main(string[] args)

    {

        var factory = new ConnectionFactory();//创建连接工厂并初始连接

        factory.HostName = "localhost";

        factory.UserName = "zwj";

        factory.Password = "www.zuowenjun.cn";

        using (var connection = factory.CreateConnection())//创建一个连接

        {

            using (var channel = connection.CreateModel()) //创建一个通道

            {

                channel.QueueDeclare("hello"falsefalsefalsenull);//创建一个队列

                string message = "";

                while (message!="exit")

                {

                    Console.Write("Please enter the message to be sent:");

                    message = Console.ReadLine();

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

                    channel.BasicPublish("""hello"null, body); //发送消息

                    Console.WriteLine("set message: {0}", message);

                }

            }

        }

    }

}

/// <summary>

/// 消费者,一般用在服务端

/// </summary>

class RabbitMQConsume

{

    static void Main(string[] args)

    {

        var factory = new ConnectionFactory();//创建连接工厂并初始连接

        factory.HostName = "localhost";

        factory.UserName = "zwj";

        factory.Password = "www.zuowenjun.cn";

        using (var connection = factory.CreateConnection())//创建一个连接

        {

            using (var channel = connection.CreateModel())//创建一个通道

            {

                channel.QueueDeclare("hello"falsefalsefalsenull);//创建一个队列

                var consumer = new QueueingBasicConsumer(channel);//创建一个消费者

                channel.BasicConsume("hello"true, consumer);//开启消息者与通道、队列关联

                Console.WriteLine(" waiting for message.");

                while (true)

                {

                    var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();//接收消息并出列

                    var body = ea.Body;//消息主体

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

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

                    if (message == "exit")

                    {

                        Console.WriteLine("exit!");

                        break;

                    }

                }

            }

        }

        

    }

}

2.负载均衡处理模式:采用默认的exchange(交换机)+智能分发+默认的exchange类型:direct+手动应答

消息生产者/发布者代码与上面相同;

以下是消费者代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

/// <summary>

/// 消费者,一般用在服务端

/// </summary>

class RabbitMQConsume

{

    static void Main(string[] args)

    {

        var factory = new ConnectionFactory();//创建连接工厂并初始连接

        factory.HostName = "localhost";

        factory.UserName = "zwj";

        factory.Password = "www.zuowenjun.cn";

        using (var connection = factory.CreateConnection())//创建一个连接

        {

            using (var channel = connection.CreateModel())//创建一个通道

            {

                channel.QueueDeclare("hello"falsefalsefalsenull);//创建一个队列

                channel.BasicQos(0, 1, false);//在一个工作者还在处理消息,并且没有响应消息之前,不要给他分发新的消息。相反,将这条新的消息发送给下一个不那么忙碌的工作者。

                var consumer = new QueueingBasicConsumer(channel);//创建一个消费者

                channel.BasicConsume("hello"false, consumer);//开启消息者与通道、队列关联

                Console.WriteLine(" waiting for message.");

                while (true)

                {

                    var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();//接收消息并出列

                    var body = ea.Body;//消息主体

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

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

                    channel.BasicAck(ea.DeliveryTag, false);

                    if (message == "exit")

                    {

                        Console.WriteLine("exit!");

                        break;

                    }

                    Thread.Sleep(1000);

                }

            }

        }

        

    }

}

3.消息持久化模式:在2的基础上加上持久化,这样即使生产者或消费者或服务端断开,消息均不会丢失


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

/// <summary>

/// 消息发送者,一般用在客户端

/// </summary>

class RabbitMQPublish

{

    static void Main(string[] args)

    {

        var factory = new ConnectionFactory();//创建连接工厂并初始连接

        factory.HostName = "localhost";

        factory.UserName = "zwj";

        factory.Password = "www.zuowenjun.cn";

        using (var connection = factory.CreateConnection())//创建一个连接

        {

            using (var channel = connection.CreateModel()) //创建一个通道

            {

                channel.QueueDeclare("hello"truefalsefalsenull);//创建一个队列,第2个参数为true表示为持久队列

                var properties = channel.CreateBasicProperties();

                //properties.SetPersistent(true);这个方法提示过时,不建议使用

                properties.DeliveryMode = 2;//1表示不持久,2.表示持久化

                string message = "";

                while (message!="exit")

                {

                    Console.Write("Please enter the message to be sent:");

                    message = Console.ReadLine();

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

                    channel.BasicPublish("""hello", properties, body); //发送消息

                    Console.WriteLine("set message: {0}", message);

                }

            }

        }

    }

}

/// <summary>

/// 消费者,一般用在服务端

/// </summary>

class RabbitMQConsume

{

    static void Main(string[] args)

    {

        var factory = new ConnectionFactory();//创建连接工厂并初始连接

        factory.HostName = "localhost";

        factory.UserName = "zwj";

        factory.Password = "www.zuowenjun.cn";

        using (var connection = factory.CreateConnection())//创建一个连接

        {

            using (var channel = connection.CreateModel())//创建一个通道

            {

                channel.QueueDeclare("hello"truefalsefalsenull);//创建一个队列,第2个参数为true表示为持久队列

                channel.BasicQos(0, 1, false);//在一个工作者还在处理消息,并且没有响应消息之前,不要给他分发新的消息。相反,将这条新的消息发送给下一个不那么忙碌的工作者。

                var consumer = new QueueingBasicConsumer(channel);//创建一个消费者

                channel.BasicConsume("hello"false, consumer);//开启消息者与通道、队列关联

                Console.WriteLine(" waiting for message.");

                while (true)

                {

                    var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();//接收消息并出列

                    var body = ea.Body;//消息主体

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

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

                    channel.BasicAck(ea.DeliveryTag, false);

                    if (message == "exit")

                    {

                        Console.WriteLine("exit!");

                        break;

                    }

                    Thread.Sleep(1000);

                }

            }

        }

        

    }

}

4.广播订阅模式:定义一个交换机,其类型设为广播类型,发送消息时指定这个交换机,消费者的消息队列绑定到该交换机实现消息的订阅,订阅后则可接收消息,未订阅则无法收到消息


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

/// <summary>

/// 消息发送者/生产者,一般用在客户端

/// </summary>

class RabbitMQPublish

{

    static void Main(string[] args)

    {

        var factory = new ConnectionFactory();//创建连接工厂并初始连接

        factory.HostName = "localhost";

        factory.UserName = "zwj";

        factory.Password = "www.zuowenjun.cn";

        using (var connection = factory.CreateConnection())//创建一个连接

        {

            using (var channel = connection.CreateModel()) //创建一个通道

            {

                channel.ExchangeDeclare("publish""fanout",true);//定义一个交换机,且采用广播类型,并设为持久化

                string queueName = channel.QueueDeclare("hello"truefalsefalsenull);//创建一个队列,第2个参数为true表示为持久队列,这里将结果隐式转换成string

                var properties = channel.CreateBasicProperties();

                //properties.SetPersistent(true);这个方法提示过时,不建议使用

                properties.DeliveryMode = 2;//1表示不持久,2.表示持久化

                string message = "";

                while (message!="exit")

                {

                    Console.Write("Please enter the message to be sent:");

                    message = Console.ReadLine();

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

                    channel.BasicPublish("publish""hello", properties, body); //发送消息,这里指定了交换机名称,且routeKey会被忽略

                    Console.WriteLine("set message: {0}", message);

                }

            }

        }

    }

}

/// <summary>

/// 消费者,一般用在服务端

/// </summary>

class RabbitMQConsume

{

    static void Main(string[] args)

    {

        var factory = new ConnectionFactory();//创建连接工厂并初始连接

        factory.HostName = "localhost";

        factory.UserName = "zwj";

        factory.Password = "www.zuowenjun.cn";

        using (var connection = factory.CreateConnection())//创建一个连接

        {

            using (var channel = connection.CreateModel())//创建一个通道

            {

                channel.ExchangeDeclare("publish""fanout"true);//定义一个交换机,且采用广播类型,并持久化该交换机,并设为持久化

                string queueName = channel.QueueDeclare("hello"truefalsefalsenull);//创建一个队列,第2个参数为true表示为持久队列

                channel.QueueBind(queueName, "publish""");//将队列绑定到名publish的交换机上,实现消息订阅

                channel.BasicQos(0, 1, false);//在一个工作者还在处理消息,并且没有响应消息之前,不要给他分发新的消息。相反,将这条新的消息发送给下一个不那么忙碌的工作者。

                var consumer = new QueueingBasicConsumer(channel);//创建一个消费者

                channel.BasicConsume(queueName, false, consumer);//开启消息者与通道、队列关联

                Console.WriteLine(" waiting for message.");

                while (true)

                {

                    var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();//接收消息并出列

                    var body = ea.Body;//消息主体

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

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

                    channel.BasicAck(ea.DeliveryTag, false);//应答

                    if (message == "exit")

                    {

                        Console.WriteLine("exit!");

                        break;

                    }

                    Thread.Sleep(1000);

                }

            }

        }

        

    }

}

5.主题订阅模式:定义一个交换机,其类型设为主题订阅类型,发送消息时指定这个交换机及RoutingKey,消费者的消息队列绑定到该交换机并匹配到RoutingKey实现消息的订阅,订阅后则可接收消息,未订阅则无法收到消息


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

/// <summary>

/// 消息发送者/生产者,一般用在客户端

/// </summary>

class RabbitMQPublish

{

    static void Main(string[] args)

    {

        var factory = new ConnectionFactory();//创建连接工厂并初始连接

        factory.HostName = "localhost";

        factory.UserName = "zwj";

        factory.Password = "www.zuowenjun.cn";

        using (var connection = factory.CreateConnection())//创建一个连接

        {

            using (var channel = connection.CreateModel()) //创建一个通道

            {

                channel.ExchangeDeclare("publish-topic""topic"true);//定义一个交换机,且采用广播类型,并持久化该交换机

               channel.QueueDeclare("hello-mq"truefalsefalsenull);//创建一个队列,第2个参数为true表示为持久队列

                var properties = channel.CreateBasicProperties();

                //properties.SetPersistent(true);这个方法提示过时,不建议使用

                properties.DeliveryMode = 2;//1表示不持久,2.表示持久化

                string message = "";

                while (message!="exit")

                {

                    Console.Write("Please enter the message to be sent:");

                    message = Console.ReadLine();

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

                    channel.BasicPublish("publish-topic""hello.test", properties, body); //发送消息,这里指定了交换机名称,且routeKey会被忽略

                    Console.WriteLine("set message: {0}", message);

                }

            }

        }

    }

}

/// <summary>

/// 消费者,一般用在服务端

/// </summary>

class RabbitMQConsume

{

    static void Main(string[] args)

    {

        var factory = new ConnectionFactory();//创建连接工厂并初始连接

        factory.HostName = "localhost";

        factory.UserName = "zwj";

        factory.Password = "www.zuowenjun.cn";

        using (var connection = factory.CreateConnection())//创建一个连接

        {

            using (var channel = connection.CreateModel())//创建一个通道

            {

                channel.ExchangeDeclare("publish-topic""topic",true);//定义一个交换机,且采用广播类型,并持久化该交换机

                string queueName = channel.QueueDeclare("hello-mq"truefalsefalsenull);//创建一个队列,第2个参数为true表示为持久队列

                channel.QueueBind(queueName, "publish-topic""*.test");//将队列绑定到路由上,实现消息订阅

                channel.BasicQos(0, 1, false);//在一个工作者还在处理消息,并且没有响应消息之前,不要给他分发新的消息。相反,将这条新的消息发送给下一个不那么忙碌的工作者。

                var consumer = new QueueingBasicConsumer(channel);//创建一个消费者

                channel.BasicConsume(queueName, false, consumer);//开启消息者与通道、队列关联

                Console.WriteLine(" waiting for message.");

                while (true)

                {

                    var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();//接收消息并出列

                    var body = ea.Body;//消息主体

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

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

                    channel.BasicAck(ea.DeliveryTag, false);//应答

                    if (message == "exit")

                    {

                        Console.WriteLine("exit!");

                        break;

                    }

                    Thread.Sleep(1000);

                }

            }

        }

        

    }

}

  

交换机路由类型如下:

Direct Exchange:直接匹配,通过Exchange名称+RoutingKey来发送与接收消息;

Fanout Exchange:广播订阅,向所有消费者发布消息,但只有消费者将队列绑定到该路由才能收到消息,忽略RoutingKey;

Topic Exchange:主题匹配订阅,这里的主题指的是RoutingKey,RoutingKey可以采用通配符,如:*或#,RoutingKey命名采用.来分隔多个词,只有消费者将队列绑定到该路由且指定的RoutingKey符合匹配规则时才能收到消息;

Headers Exchange:消息头订阅,消息发布前,为消息定义一个或多个键值对的消息头,然后消费者接收消息时同样需要定义类似的键值对请求头,里面需要多包含一个匹配模式(有:x-mactch=all,或者x-mactch=any),只有请求头与消息头相匹配,才能接收到消息,忽略RoutingKey;

本文内容参考了以下文章:

.NET 环境中使用RabbitMQ

.Net下RabbitMQ的使用系列文章

分类: C#

时间: 2024-10-10 18:11:30

消息队列RabbitMQ的相关文章

消息队列--RabbitMQ(一)

1.消息队列概述 可以理解为保存消息的一个媒介/或者是个容器,与之相关有两个概念(即生产者(Publish)与消费者(Consumer)).所谓生产者,就是生产创造消息的一方,那么,消费者便是从队列中取出消息,完成相应的某种目的.总而言之,消息队列是搭建生产者与消费者沟通的一座桥梁. 消息队列的产品也很多,作用也各有千秋.常见的消息队列有RabbitMQ.RocketMq.KafKa,本系列文章将以(RabbitMQ+C#客户端+Windonw)为例去探索消息队列的基本用途及相关使用.闲话不说,

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

一.课程介绍 人生苦短,我用.NET Core!消息队列RabbitMQ大家相比都不陌生,本次分享课程阿笨将给大家分享一下在一般项目中99%都会用到的消息队列MQ的一个实战业务运用场景.本次分享课程不是零基础教学,课程内容的侧重点是讲解的RabbitMQ的最实用.最简单的实战运用场景:Publish/Subscrib(发布/订阅)模式,发送端发送消息,单个接收端接收处理消息. 学完本次"是猴子都看的懂的消息队列RabbitMQ实战课程"后,阿笨带直接让你也能如此优雅简单的上手使用Rab

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

前言:如果你对rabbitmq基本概念都不懂,可以移步此篇博文查阅消息队列RabbitMQ 一.单发单收 二.工作队列Work Queue 三.发布/订阅 Publish/Subscribe 四.路由Routing 五.Topic类型的exchange 六.rabbitmq部分封装代码及装备工作 一.单发单收 在下图中,“ P”是我们的生产者,“ C”是我们的消费者.中间的框是一个队列-RabbitMQ代表使用者保留的消息缓冲区. 单发单收模式下:一发一收 发送端只需要创建队列,然后向队列发送消

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

http://blog.csdn.net/super_rd/article/details/70238869 没错我还是没有讲怎么安装和写一个HelloWord,不过快了,这一章我们先了解下RabbitMQ的基本概念. RabbitMQ架构 说是架构其实更像是应用场景下的架构(自己画的有点丑,勿嫌弃) 从图中可以看出RabbitMQ主要由Exchange和Queue两部分组成,然后通过RoutingKey关联起来,消息投递到Exchange然后通过Queue接收. RabbitMQ消息队列基本概

消息队列 RabbitMQ

前言 市面上的消息队列产品有很多,比如老牌的 ActiveMQ.RabbitMQ ,目前我看最火的 Kafka ,还有 ZeroMQ ,阿里巴巴捐赠给 Apache 的 RocketMQ ,连 redis 这样的 NoSQL 数据库也支持 MQ 功能.总之这块知名的产品就有十几种. 什么是rabbitMQ RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现.一款基于AMQP协议的消息中间件,它能够在应用之间提供可靠的消息传输.在易用性,扩展性,高可用性上表现优秀.而且使用

自动化运维Python系列之消息队列RabbitMQ

RabbitMQ RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco .Redhat.iMatix 等联合制定了 AMQP 的

消息队列 RabbitMQ 入门介绍

来源:http://ityen.com/archives/578 一.什么是RabbitMQ? RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗.消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然:   例如一个日志系统,很容易使用RabbitMQ简化工作量,一个Consumer可以进行消息的正常处理,另一个Consumer负责对消息进行日志记录,只要在

php 消息队列 rabbitmq 的安装使用

今天尝试安装了 rabbitmq ,用作php 的消息队列,下面是具体的步骤 首先呢,需要在github 下载这个包,我这里用的是 v0.5.2 版本的 rabbitmq v0.5.2 接下来,通过 使用 .sh脚本,进行安装 1 #切换目录到 rabbittmq-c ,更改文件属性 2 chmod -a+x travis.sh 3 4 #初始化 5 ./travis.sh autotools 6 7 #安装 8 ./travis.sh cmake 再然后,使用 pecl 安装php 的 amq

python中消息队列RabbitMQ的使用

1,简介 RabbitMQ(Rabbit Message Queue)是流行的开源消息队列系统,用erlang语言开发. 1.1关键词说明: Broker:消息队列服务器实体.Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列.Queue:消息队列载体,每个消息都会被投入到一个或多个队列.Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来.Routing Key:路由关键字,exchange根据这个关键字进行消息投递.vhost:虚拟主机,一个b