rabbitMq的集中工作模式
1、Work Queues
1)、在多个worker之间布置时间紧密型任务
2)、主要思想避免立即执行资源密集型任务等待它完成
3)、每一个任务都会明确的分配给指定的worker(并非广播方式)
//生产者端代码
using System;
using RabbitMQ.Client;
using System.Text;
class NewTask
{
public static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using(var connection = factory.CreateConnection())
using(var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "task_queue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
var message = GetMessage(args);
var body = Encoding.UTF8.GetBytes(message);
var properties = channel.CreateBasicProperties();
properties.SetPersistent(true);
channel.BasicPublish(exchange: "",
routingKey: "task_queue",
basicProperties: properties,
body: body);
Console.WriteLine(" [x] Sent {0}", message);
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
private static string GetMessage(string[] args)
{
return ((args.Length > 0) ? string.Join(" ", args) : "Hello World!");
}
}
using System; using RabbitMQ.Client; using RabbitMQ.Client.Events; using System.Text; using System.Threading; class Worker { public static void Main() { var factory = new ConnectionFactory() { HostName = "localhost" }; using(var connection = factory.CreateConnection()) using(var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "task_queue", durable: true, exclusive: false, autoDelete: false, arguments: null); channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false); Console.WriteLine(" [*] Waiting for messages."); var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine(" [x] Received {0}", message); int dots = message.Split('.').Length - 1; Thread.Sleep(dots * 1000); Console.WriteLine(" [x] Done"); channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); }; channel.BasicConsume(queue: "task_queue", noAck: false, consumer: consumer); Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } } }二、Publish/Subscribe
该方式的工作特点:会把消息已广播的形式发送给所有接收者(receiver)
1)、引入了exchange概念
2)、producer不直接发消息到queue中,而是通过exchange发送到queue中
Temporary queues(临时队列)
在前面的实例中task_queue其实就是临时队列,可以为临时队列命名 这样生产者和消费者就可以共享队列
4、Routing
前面是广播的形式发送所有消息,改模式可以实现对消息有选择的接收
Direct exchange
可以实现有选择的把消息发送到某个队列中,从而实现了消费者的特定需求通过上图可以看出direct exchange可以把消息有选择的发送到相应的队列1和队列2中