-
Notifications
You must be signed in to change notification settings - Fork 22
RabbitMQ
RabbitMQ是轻量级的,并且易于在内部和云中部署。 它支持多种消息传递协议。 RabbitMQ可以部署在分布式和联合配置中,以满足高规模,高可用性要求
RabbitMQ支持在许多操作系统和云环境中运行,并为大多数流行语言提供各种开发人员工具
官网
基础概念
来自官方的基础知识
RabbitMQ是一个消息代理:它接受和转发消息
您可以将其视为邮局:当您将要发布的邮件放在邮箱中时,您可以确定RabbitMQ最终会将邮件发送给您的收件人
RabbitMQ和邮局之间的主要区别在于它不处理纸张,而是接受,存储和转发二进制blob数据 - 消息
制作(Producing)只不过是发送。 发送消息的程序是生产者(producer):
队列(queue)是RabbitMQ中的邮箱的名称。 虽然消息流经RabbitMQ和您的应用程序,但它们只能存储在队列中。 队列只受主机的内存和磁盘限制的约束,它本质上是一个大的消息缓冲区。 许多生产者可以发送到一个队列的消息,并且许多消费者可以尝试从一个队列接收数据。 这就是我们代表队列的方式:
消费(Consuming)与接受有类似的意义。 消费者(consumer)是一个主要等待接收消息的程序:
请注意,生产者,消费者和代理不必驻留在同一主机上; 实际上在大多数应用中他们没有。
应用程序也可以是生产者和消费者。
使用Docker安装RabbitMQ镜像(RabbitMQ Server)
docker run -d --name myrabbitmq -p 5673:5672 -p 15673:15672 docker.io/rabbitmq:3-management
如图所示的映射关系,端口15673为管理后台,5673为服务端口
访问http://localhost:15673
账号密码默认为guest
/guest
,登录
docker rabbitmq镜像与相关设置
使用docker安装rabbitmq及遇到的问题
包括一个生产者和一个消费者
生产者
public class Send
{
public static IConnection connection { get; set; }
public static IModel channel { get; set; }
public static void Run(string ipaddress, int port, string userName, string password)
{
var factory = new ConnectionFactory() { HostName = ipaddress, Port = port, UserName = userName, Password = password };
connection = factory.CreateConnection();
channel = connection.CreateModel();
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
Timer aTimer = new System.Timers.Timer(2000);
int count = 1;
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += (sender, e) =>
{
string message = $"Hello World:{count}";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "",
routingKey: "hello",
basicProperties: null,
body: body);
Console.WriteLine($"{DateTime.Now} [x] Sent {message}" );
count++;
};
aTimer.AutoReset = true;
aTimer.Enabled = true;
}
}
消费者
public class Receive
{
public static IConnection connection { get; set; }
public static IModel channel { get; set; }
public static void Run(string ipaddress, int port, string userName, string password)
{
var factory = new ConnectionFactory() { HostName = ipaddress, Port = port, UserName = userName, Password = password };
connection = factory.CreateConnection();
channel = connection.CreateModel();
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine($"{DateTime.Now} [x] Received {message}");
};
channel.BasicConsume(queue: "hello",
autoAck: true,
consumer: consumer);
}
}
效果
管理后台可以看到
队列中的消息数量、速度
连接客户端列表
渠道列表