[Open Source] RabbitMQ 安装与使用
前言
吃多了拉就是队列,吃饱了吐就是栈
- 使用场景
- 对操作的实时性要求不高,而需要执行的任务极为耗时;(发送短信,邮件提醒,更新文章阅读计数,记录用户操作日志)
- 存在异构系统间的整合;
安装
-
- 安装完确定ERLANG_HOME环境变量是否添加,否则:
Setx ERLANG_HOME “D:\Program Files\erl8.2″
- 安装完确定ERLANG_HOME环境变量是否添加,否则:
-
- 安装完通过
rabbitmqctl status
确定rabbitmq状态
- 安装完通过
管理服务
- 默认安装成功会自动启动服务
- 通过开始菜单可以启动,停止,卸载服务
占用端口
- 4369(集群、Erlang)
- 5671,5672(应用层标准高级消息队列协议)
- 25672(Erlang分发,CLI通信)
- 15672(如果管理插件启用)
- 61613,61614(如果消息文本协议STOMP已启用)
- 1883,8883(如果erl实时通信已启用)
支持的平台
- 基于Ubuntu和Debian的Linux发行版
- 基于Fedora,CentOS和RPM的Linux发行版
- Mac OS X
- Windows XP及更高版本
概念
Connections:客户端连接,创建该资源非常耗时,应尽量避免多次创建。
Channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Broker:简单来说就是消息队列服务器实体。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接收消息的程序。
消息队列的发送过程大概如下:
- 客户端创建Connection,连接到消息队列服务器,打开一个channel。
- 客户端声明一个Exchange,并设置相关属性。
- 客户端声明一个Queue,并设置相关属性。
- 客户端使用routing key,在exchange和queue之间建立好绑定关系。
- 客户端发送消息首先到exchange
- exchange根据type路由到对应的队列(可以是多个队列)中.
Exchange Type
- direct(直连)
- routing key 与 binding key相同
- fanout
- 给所有绑定队列发送消息
- topic
- routing key:audit.irs.corporate => binding key:audit.#
- routing key:audit.irs => binding key:audit.*
- default
- direct
- binding key为queue名称
常用命令
管理插件
rabbitmq-plugins enable rabbitmq_management
// 启用rabbitmq-plugins disable rabbitmq_management
// 禁用
管理队列
rabbitmqctl list_queues
// 查看队列
管理用户及权限
rabbitmqctl list_users
// 查看所有用户rabbitmqctl add_user user_admin passwd_admin
// 添加用户rabbitmqctl set_user_tags user_admin administrator
// 添加权限rabbitmqctl delete_user guest
// 删除用户rabbitmqctl change_password {username} {newpassowrd}
// 修改密码
管理虚拟主机vhost
rabbitmqctl add_vhost vhostpath
// 创建虚拟主机rabbitmqctl delete_vhost vhostpath
// 删除虚拟主机rabbitmqctl list_vhosts
// 列出所有虚拟主机
使用
- 发送消息(以持久化代码为例)
var factory = new ConnectionFactory
{
HostName = hostName, // rabbit server
UserName = "admin",
Password = "admin",
Port = 5672, // Broker端口
VirtualHost = "/" // 虚拟Host,需提前配置
};
using (var connection = factory.CreateConnection()) // 创建与RabbitMQ服务器的连接
{
using (var channel = connection.CreateModel()) // 创建1个Channel(大部分API在该Channel中)
{
// 定义1个队列,自动会和默认的exchange 做direct类型绑定
channel.QueueDeclare(
queue: "hello", // 队列名称
durable: true, // 队列是否持久化
exclusive: false, // 排他队列:如果一个队列被声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除。(活动在一次连接内)
autoDelete: false, // 自动删除:当最后一个消费者取消订阅时,队列自动删除。如果您需要仅由一个使用者使用的临时队列,请将自动删除与排除。当消费者断开连接时,队列将被删除。(至少消费者能连一次)
arguments: null); // 配置参数
var randomQueue = channel.QueueDeclare(); // 定义随机的队列 该队列为临时队列(排他队列 + 自动删除)
// 定义Exchange(一般而言,不需要定义exchange,rabbitmq默认创建了所有类型的exchange)
//channel.ExchangeDeclare("direct-demo", ExchangeType.Direct); // 定义direct exchange
//channel.ExchangeDeclare("fannout-demo", ExchangeType.Fanout); // 定义fanout exchange
//channel.ExchangeDeclare("topic-demo", ExchangeType.Topic); // 定义fanout exchange
// 定义queue exchange key 关系(在某些业务场景下,会使用该关系做路由功能)
//channel.QueueBind(queue: "hello", exchange: "amq.direct", routingKey: "hello"); // 默认绑定的关系和该行代码效果一样
//channel.QueueBind("hello", "amq.fanout", "hello"); // 该类型下的routingKey 实际不需要
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
while (true)
{
string message = "Hello World!" + DateTime.Now;
var body = Encoding.UTF8.GetBytes(message);
// 发送消息到队列中
channel.BasicPublish(
exchange: string.Empty, // 传递为Empty的时候,通过 `(AMQP default)`传递
routingKey: "hello", // routing key 与 queuebind中的binding key对应
basicProperties: properties, // 消息header
body: body); // 消息body:发送的是bytes 可以任意编码
Console.WriteLine(" [x] Sent {0}", message);
}
}
}
- 接收消息(以消息响应为例)
var factory = new ConnectionFactory
{
HostName = hostName, // rabbit server
UserName = "admin",
Password = "admin",
Port = 5672, // Broker端口
VirtualHost = "/" // 虚拟Host,需提前配置
};
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
var consumer = new EventingBasicConsumer(channel); // 创建Consumer
consumer.Received += (model, ea) => // 通过回调函数异步推送我们的消息
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Thread.Sleep(1000);
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); // 消息响应
Console.WriteLine(" [x] Received {0}", message);
};
channel.BasicQos(0, 1, false); // 设置perfetchCount=1 。这样就告诉RabbitMQ 不要在同一时间给一个工作者发送多于1个的消息
channel.BasicConsume(queue: "hello",
noAck: false, // 需要消息响应(Acknowledgments)机制
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
消息响应(acknowledgments)
- 为了防止消息丢失,RabbitMQ提供了消息响应(acknowledgments)机制。消费者会通过一个ack(响应),告诉RabbitMQ已经收到并处理了某条消息,然后RabbitMQ才会释放并删除这条消息。
持久化
- 新队列(无法修改队列)配置为可持久化
- 发送消息配置为持久化
- 消息什么时候刷到磁盘?
- 写入文件前会有一个Buffer,大小为1M,数据在写入文件时,首先会写入到这个Buffer,如果Buffer已满,则会将Buffer写入到文件(未必刷到磁盘)。
- 固定的刷盘时间:25ms,也就是不管Buffer满不满,每个25ms,Buffer里的数据及未刷新到磁盘的文件内容必定会刷到磁盘。
- 每次消息写入后,如果没有后续写入请求,则会直接将已写入的消息刷到磁盘:使用Erlang的receive x after 0实现,只要进程的信箱里没有消息,则产生一个timeout消息,而timeout会触发刷盘操作。
常见问题
RabbitMQ 管理插件启动报错
- 确认RabbitMQ服务是否启动
- C:\Windows目录下,将.erlang.cookie文件,拷贝到用户目录下 C:\Users{用户名},这是Erlang的Cookie文件,允许与Erlang进行交互
- 重新安装erl 和 rabbit,尽量不要带空格的路径
修改配置文件
[Open Source] RabbitMQ 安装与使用的更多相关文章
- Day11 Memcached、Redis和RabbitMQ安装
修改Ubuntu镜像源: sudo vi /etc/apt/sources.list 全部替换为以下内容: ---------------------------------------------- ...
- RabbitMQ安装与初始配置
[TOC] 本文只讨论linux下的Rabbitmq安装. Erlang安装 rabbitmq依赖于Erlang,需先安装,推荐安装rabbitmq/erlang-rpm: #clone源码 git ...
- Linux下RabbitMq安装
在大多数大公司,像应用服务器软件的安装.部署都是运维的事情,其实自己去尝试部署一下,也是有收获的. 有机会正好尝试了Linux下的rabbitMq安装过程,做了记录,希望有用到的人可以做下参考. 安装 ...
- CentOS 7 rabbitmq 安装
OS版本:CentOS 7.2Rrlang:19.2RabbitMQ:3.6.6 1.1 erlang安装 1. http://www.erlang.org/下载erlang,解压缩,进入目录,检查环 ...
- rabbitmq安装与高可用集群配置
rabbitmq版本:3.6.12 rabbitmq安装 1.安装openssl wget http://www.openssl.org/source/openssl-1.0.0a.tar.gz &a ...
- rabbitmq安装及基本操作(含集群配置)
一.rabbitmq的安装 因为rabbitmq是基于 erlang语言开发,所有要先安装erlang 1.安装erlang 这里我下载的是19.2的版本,地址为https://www.erlang. ...
- RabbitMQ安装 ubuntu12.04LTS
RabbitMQ安装需要安装较多的依赖包,之前如果安装过RabbitMQ-server必须要先彻底删除. 重装的ubuntu系统(ubuntu server)的开发环境几乎是裸的,再重新编译安装erl ...
- centos7 rabbitmq安装以及应用
安装单机rabbitmq 1.安装erlang cd /usr.local yum install wget yum install net-tools wget http://erlang.or ...
- 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程
简述C#中IO的应用 在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...
随机推荐
- 故障排查实战案例——某电器ERP系统日志暴增
前言 本篇文章写在新春佳节前夕,也是给IT运维朋友一个警醒,在春节长假前请妥善体检自己的系统安心过个年. 千里之堤毁于蚁穴,一条看似简单的语句就能拖垮整个系统,您的SQL Server很久没体检了吧? ...
- Kettle(Pentaho)实现web方式远程执行job或transformation
一.背景 公司在用kettle做数据etl,每做完一个job或transformation发布上线想要立即执行看数据效果的话每次都是找运维同学登陆服务器打开kettle找到对应的文件点击执行,整个过程 ...
- iOS页面间传值的五种方式总结(Delegate/NSNotification/Block/NSUserDefault/单例)
iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例) iOS页面间传值的方式(NSUserDefault/Delegate/NSNot ...
- Plugin execution not covered by lifecycle configuration的解决方案
pom配置文件中,提示错误:Plugin execution not covered by lifecycle configuration. 如图: 这表示m2e在其执行maven的生命周期管理时没有 ...
- Monit:开源服务器监控工具
Monit是一个跨平台的用来监控Unix/linux系统(比如Linux.BSD.OSX.Solaris)的工具.Monit特别易于安装,而且非常轻量级(只有500KB大小),并且不依赖任何第三方程序 ...
- JVM内存分配与回收策略
对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配. 当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC. Minor GC:新生代GC,指发生在新生代的垃圾收集动作 ...
- gridcontrol显示行号,总行,打印,导出Excel,设置标头及内容居中方法
1.一般为了表格显示数据更直观,经常会显示行号以及总数.让gridcontrol显示行号,首先你需要设置一下显示行号的宽度,也就是IndicatorWith.默认值为-1,可根据实际数值需要设置宽度, ...
- 关于jquery中封装函数如何传递当前元素的问题
需要对页面上一组元素进行ajax操作 <div id="aid"></div> <div id="aid"></div ...
- 从源码解析LinkedList集合
上篇文章我们介绍了ArrayList类的基本的使用及其内部的一些方法的实现原理,但是这种集合类型虽然可以随机访问数据,但是如果需要删除中间的元素就需要移动一半的元素的位置,效率低下.并且它内 ...
- 浅析NopCommerce的多语言方案
前言 这段时间在研究多语言的实现,就找了NopCommerce这个开源项目来研究了一下,并把自己对这个项目的粗浅认识与大家分享一下. 挺碰巧的是昨天收到了NopCommerce 3.90 发布测试版的 ...