当我们使用 RabbitMQ 发布和订阅模式时如何调用另一个方法?
How to call another method when we are using RabbitMQ Publish and Subscriber pattern?
我有一个程序需要处理来自两个来源的事务,第一个来自 RabbitMQ,另一个来自数据库。对于第一个,我正在使用 RabbitMQ 发布和订阅者模式,这样只要有任何事务进入队列,那么此方法就可以处理该事务,但是发布和订阅者模式的问题是,它没有将控制权交给其他方法。如果交易是从队列中处理的,那么它正在等待新的交易。我知道这是这种模式的行为,但是如果队列中没有交易,如何在两者之间调用其他方法(来自数据库的交易)。
有趣的东西。关于 CPython 的真相是,由于 GIL,它本质上是单线程的。因此,当订阅者线程是 运行 - 我猜你正在使用线程 - 订阅者实际上正在轮询新消息,因此总是很忙,所以它永远不会放弃对数据库线程的控制。解决方案:切换到多处理模块而不是线程。或者你可以交错轮询 RabbitMQ 和工作你的数据库线程。
我已经使用下面的代码解决了这个问题
private void Poll()
{
while (Enabled)
{
try
{
BasicDeliverEventArgs objBasicDeliverEventArgs;
//Get next message
var boolMessageRecieved = _subscription.Next(60000, out objBasicDeliverEventArgs);
//Deserialize message
if (boolMessageRecieved)
{
var objEvent = DeSerialize(objBasicDeliverEventArgs.Body);
if (objEvent != null)
{
registerService.Process(objEvent);
_subscription.Ack();
}
}
else
{
//DB realted process.
Console.WriteLine("Idle time because there is no messages in queue");
System.Threading.Thread.Sleep(60000);
}
}
catch (Exception)
{
//log
}
}
}
我有一个程序需要处理来自两个来源的事务,第一个来自 RabbitMQ,另一个来自数据库。对于第一个,我正在使用 RabbitMQ 发布和订阅者模式,这样只要有任何事务进入队列,那么此方法就可以处理该事务,但是发布和订阅者模式的问题是,它没有将控制权交给其他方法。如果交易是从队列中处理的,那么它正在等待新的交易。我知道这是这种模式的行为,但是如果队列中没有交易,如何在两者之间调用其他方法(来自数据库的交易)。
有趣的东西。关于 CPython 的真相是,由于 GIL,它本质上是单线程的。因此,当订阅者线程是 运行 - 我猜你正在使用线程 - 订阅者实际上正在轮询新消息,因此总是很忙,所以它永远不会放弃对数据库线程的控制。解决方案:切换到多处理模块而不是线程。或者你可以交错轮询 RabbitMQ 和工作你的数据库线程。
我已经使用下面的代码解决了这个问题
private void Poll()
{
while (Enabled)
{
try
{
BasicDeliverEventArgs objBasicDeliverEventArgs;
//Get next message
var boolMessageRecieved = _subscription.Next(60000, out objBasicDeliverEventArgs);
//Deserialize message
if (boolMessageRecieved)
{
var objEvent = DeSerialize(objBasicDeliverEventArgs.Body);
if (objEvent != null)
{
registerService.Process(objEvent);
_subscription.Ack();
}
}
else
{
//DB realted process.
Console.WriteLine("Idle time because there is no messages in queue");
System.Threading.Thread.Sleep(60000);
}
}
catch (Exception)
{
//log
}
}
}