使用 .NET 8 在内存任务队列模式中进行作业调度和重复数据删除事件

问题描述 投票:0回答:1

我有一个我想要发送的消息的数据库。每个消息都有一个唯一的消息标识符,并由另一个进程放入数据库中。两个进程之间的唯一通信是通过数据库表。

每隔 x 分钟(假设是 15 分钟),我想检查此数据库,然后安排它们以高性能的方式发送,从而控制一次同时发送多条消息。

我们可能随时有 100,000 多条消息要发送,并且发送所有消息可能需要比预定频率更长的时间(因此个别作业会重叠)。

目标平台是 .NET 8 上的 C#。

我正在考虑利用运行标准

IHost
模式的 Windows 服务。

我目前的想法是同时利用 Quartz.NET 和 MassTransit,但我不确定这是否是这两个框架的正确应用以及是否可以接受替代方案。

让作业定期运行与 Quartz.NET 配合得很好。我面临的挑战是为我想要实现的目标建立大众交通。

我最初的想法是在一个简单的 InMemory 总线上建立 Quartz.NET 作业队列(因此不需要任何外部服务),每个消息都通过其唯一的消息标识符,然后一个基本的消费者拾取该消息并完成实际工作发送。

我现在想要避免的是让多个消息/事件/命令排队等待相同的消息标识符。我可以添加一个简单的检查,检查消息是否处于预期状态,如果消息已被记录为已发送,则退出,但我想避免队列增长超过所需的时间。

本质上我想要一种方法来检查给定的消息标识符是否尚未排队。

我尝试直接设置消息 ID 例如

await _bus.Publish(new DeliverEvent { }, message => message.MessageId = messageId);

查看了分区,但我认为它们不太符合要求?

我想我可以通过使用 RabbitMQ 和重复数据删除插件来实现这一点?但我试图将这一切都保持在一个流程中。

我的做法是错误的吗?我如何使用 MassTransit 或替代库/框架来实现这一目标?

message-queue masstransit .net-8.0 quartz.net task-queue
1个回答
0
投票

您可以使用:

  • MassTransit SQL 传输
  • 消费者的事务发件箱确保消息处理一次
  • 继续使用 Quartz.NET 来安排发送这些消息的重复作业

这个组合看起来很适合您的要求。

© www.soinside.com 2019 - 2024. All rights reserved.