![](/img/trans.png)
[英]Best way to schedule messages to be sent using a Windows service in C#
[英]Parallel Handling Kafka messages in a Windows Service using C#
我有用 C# 编写的 Windows 服务。 早些时候,我们使用具有多个分区的事件中心进行消息排队。 我们最近搬到了卡夫卡。 为了在 c# 中实现事件中心,我们有IEventProcessor.ProcessEventsAsync
,它会一直监听事件中心通知,并在将消息发布到事件中心时触发,事件中心在后台异步运行
我在 Kafka 中没有找到任何等效的方法。
我这里的要求是订阅一个 Kafka 主题并持续消费消息。 当消息被消费时,还应该为该消息执行一些其他操作。 对于每条消息,执行时间大约需要 15 分钟,我希望 Kafka 消费者消费所有消息并将其保留在队列中,就像它接收到的消息并将其写入文件一样。 其他进程应该读取文件,选择消息并执行其他操作。 我希望它们都同时/并行运行。
PS:我编写了一个控制台应用程序,它可以生成和使用一条消息。我正在寻找的是排队和并行性。
对于并行性,Kafka 实现了所谓的消费者组。 Kafka 存储“偏移量”(读取:跨主题的记录键)并存储给定消费者组在处理记录时所处位置的偏移量。 这应该允许您使用相同的程序动态创建新的消费者实例,并通过更改组允许两个程序并行地为不同的任务使用相同的数据。
我发现这个链接在我创建我的第一个消费者时也很有用,以防你找到一种没有 groupId 的方法来创建它: http : //cloudurable.com/blog/kafka-tutorial-kafka-consumer/index.html
希望这可以帮助!
看看 Silverback: https : //silverback-messaging.net 。 它抽象了许多这些问题,基本用法就像这样简单:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services
.AddSilverback()
.WithConnectionToMessageBroker(options => options.AddKafka())
.AddKafkaEndpoints(
endpoints => endpoints
.Configure(
config =>
{
config.BootstrapServers = "localhost:9092";
})
.AddInbound(
endpoint => endpoint
.ConsumeFrom("my-topic")
.DeserializeJson(serializer => serializer.UseFixedType<SomeMessage>())
.Configure(
config =>
{
config.GroupId = "test-consumer-group";
config.AutoOffsetReset = AutoOffsetReset.Earliest;
})))
.AddSingletonSubscriber<MySubscriber>();
}
}
public class MySubscriber
{
public Task OnMessageReceived(SomeMessage message)
{
// TODO: process message
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.