dotnetcore / CAP

Distributed transaction solution in micro-service base on eventually consistency, also an eventbus with Outbox pattern
http://cap.dotnetcore.xyz
MIT License
6.61k stars 1.28k forks source link

Feature Request: Supports publish-only or consume-only #1563

Closed Jeacaler closed 2 months ago

Jeacaler commented 2 months ago

版本:5.2.0 业务场景:有两个服务,一个服务仅作为消息的生产者,另外一个服务仅作为消息的消费者。 cap配置: 1、生产者服务的配置 services.AddCap(x => { x.UseDispatchingPerGroup = true; x.ConsumerThreadCount = 0;//此服务仅作为生产者 x.ProducerThreadCount = 5;

//其他配置省略 }); 2、消费者服务的配置 services.AddCap(x => { x.UseDispatchingPerGroup = true; x.ConsumerThreadCount = 5; x.ProducerThreadCount = 0;//此服务仅作为消费者

//其他配置省略 });

异常信息: 此异常是消费者服务启动的时候抛出的异常。

Starting the processors throw an exception. System.ArgumentOutOfRangeException: The concurrencyLevel argument must be positive. (Parameter 'concurrencyLevel') at System.Collections.Concurrent.ConcurrentDictionary2..ctor(Int32 concurrencyLevel, Int32 capacity, Boolean growLockArray, IEqualityComparer1 comparer) at System.Collections.Concurrent.ConcurrentDictionary`2..ctor(Int32 concurrencyLevel, Int32 capacity) at DotNetCore.CAP.Processor.DispatcherPerGroup.Start(CancellationToken stoppingToken) at DotNetCore.CAP.Internal.Bootstrapper.BootstrapCoreAsync()

期望:能否修复此异常,或者让cap支持仅作为cap消息的消费者(这时候cap服务仅启动消费者线程)或仅作为消息的生产者

yang-xiaodong commented 2 months ago

一个服务仅作为消息的生产者,另外一个服务仅作为消息的消费者。

这个需求的背景是什么? 都启动会造成资源浪费?

Jeacaler commented 2 months ago

感谢大神的回复     这里我简单说一下目前遇到的业务场景:     公司业务需要在两个系统,一老系统和一新系统之间进行业务数据对接。     老系统有新用户加入时,发出cap消息,新系统订阅。新系统有新用户加入时,也发出cap消息,老系统进行订阅处理。     两个系统之间的数据没有太大的实时性要求,但有一致性要求。     实际业务比我上面描述的还要复杂些,但这几个业务特性挺适合使用cap来实现,并且两个系统对各自发出的消息都没有订阅的需求。它们都只关注对方发布的消息。

    下图是简单的业务交互

    这时候,两系统的外挂服务都仅作为消费者;而两系统仅作为生产者。

    写在最后:其实ConsumerThreadCount设置为0时报的异常并不影响组件的正常使用,但是我觉得既然允许把ConsumerThreadCount设置为0,那就不应该报异常,我个人觉得这个ArgumentException算是一个bug。

时止 @.***

 

------------------ 原始邮件 ------------------ 发件人: "dotnetcore/CAP" @.>; 发送时间: 2024年7月12日(星期五) 中午11:25 @.>; @.**@.>; 主题: Re: [dotnetcore/CAP] ConsumerThreadCount设置为0的情况下,启动的时候会报异常Starting the processors throw an exception. System.ArgumentOutOfRangeException (Issue #1563)

一个服务仅作为消息的生产者,另外一个服务仅作为消息的消费者。

这个需求的背景是什么? 都启动会造成资源浪费?

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

yang-xiaodong commented 2 months ago

老系统有新用户加入时,新系统订阅。新系统有新用户加入时,老系统进行订阅处理。 并且两个系统对各自发出的消息都没有订阅的需求。它们都只关注对方发布的消息。

这里似乎矛盾,虽然对自己的消息没有订阅,但是都需要订阅别的系统的消息呀,所以还是都有发布和订阅。

我个人觉得这个ArgumentException算是一个BUG

并不是Bug,因为CAP设计上是不允许为零,只是我们的启动时没有做校验而已。

在CAP内部对发布和订阅有很多关联性,比如在事务补偿时,发布出去一个消息,也需要订阅callback来知道消息是否正确消费。 从需求实现上还有很多其他逻辑需要处理,比如只启用发布或消费是否两个表只会生成,健康检查?重试?异常提醒?

yang-xiaodong commented 2 months ago

No response, closed!