我有一个RabbitMQ侦听器,从那里我处理传入的数据,将它们收集到7500个项目的大小,并将它们作为批量保存在Elasticsearch上(ElasticClient.IndexMany(数据))。使用批量可以得到更好的性能,这对于我的应用程序很重要。保存数据后,我知道它是否成功,我可以在RabbitMQ上确认或拒绝它们。问题是,仅在响应确认或拒绝后,我才能从RabbitMQ获取下一个数据。因此,我无法再批量处理数据。
您是否有解决该问题的想法?如何从RabbitMQ中获取许多物品,进行处理并将响应(确认或拒绝)批量发送回RabbitMQ?
答案 0 :(得分:2)
您使用prefetch和multiple acknowledgement的组合。
注意: RabbitMQ团队监视rabbitmq-users
mailing list,并且有时仅在StackOverflow上回答问题。
答案 1 :(得分:0)
感谢卢克。他的回答给了我必要的信息。 我从
更改了Program.csModel.BasicQos(0, 1, false);
收件人:
Model.BasicQos(0, NUMBER_OF_TIMESERIES_PER_BULK, false);
我添加了一个侦听器:
static void TimeSeriesBusinessComponentDeliverResponse(object sender, DeliverEventArgs e)
{
e.ListDeliverTagsAcknoledge.ForEach(tag => { Model.BasicAck((ulong)tag, false); });
e.ListDeliverTagReject.ForEach(tag => { Model.BasicReject((ulong)tag, false); });
}
我将NUMBER_OF_TIMESERIES_PER_BULK个数字保存后,然后保存到Elastic, 看起来像这样:
var responseSlimData = ElasticClientSlim.IndexMany(slimData);
DeliverEventArgs dea = new DeliverEventArgs();
if (responseSlimData.IsValid)
dea.ListDeliverTagsAcknoledge = listDeliferyTags;
else
dea.ListDeliverTagReject = listDeliferyTags;
OnDeliverResponse(dea);
// .....
public event EventHandler<DeliverEventArgs> DeliverResponse;
protected virtual void OnDeliverResponse(DeliverEventArgs e)
{
DeliverResponse?.Invoke(this, e);
}
然后添加我的EventArgs类
public class DeliverEventArgs : EventArgs
{
public DeliverEventArgs()
{
ListDeliverTagsAcknoledge = new List<ulong?>();
ListDeliverTagReject = new List<ulong?>();
}
public List<ulong?> ListDeliverTagsAcknoledge { get; set; }
public List<ulong?> ListDeliverTagReject { get; set; }
}