如何批量确认?

时间:2019-07-17 19:49:04

标签: rabbitmq

我有一个RabbitMQ侦听器,从那里我处理传入的数据,将它们收集到7500个项目的大小,并将它们作为批量保存在Elasticsearch上(ElasticClient.IndexMany(数据))。使用批量可以得到更好的性能,这对于我的应用程序很重要。保存数据后,我知道它是否成功,我可以在RabbitMQ上确认或拒绝它们。问题是,仅在响应确认或拒绝后,我才能从RabbitMQ获取下一个数据。因此,我无法再批量处理数据。

您是否有解决该问题的想法?如何从RabbitMQ中获取许多物品,进行处理并将响应(确认或拒绝)批量发送回RabbitMQ?

2 个答案:

答案 0 :(得分:2)

您使用prefetchmultiple acknowledgement的组合。


注意: RabbitMQ团队监视rabbitmq-users mailing list,并且有时仅在StackOverflow上回答问题。

答案 1 :(得分:0)

感谢卢克。他的回答给了我必要的信息。 我从

更改了Program.cs
Model.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; }
}