Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Question about missing subscriber #258

Closed
lidis opened this issue Dec 25, 2018 · 7 comments
Closed

Question about missing subscriber #258

lidis opened this issue Dec 25, 2018 · 7 comments

Comments

@lidis
Copy link

lidis commented Dec 25, 2018

I am very sorry that I can only use Chinese.

我在使用cap的时候,发现了一个问题,但是我现在还没有重现它
我的cap发起事件会间隔性找不到subscriber---“Message can not be found subscriber. ”。
我运行程序后第一次发起消息会被标记为失败,重试次数直接被标为51次,我再次发起同一个事件会执行成功,此为一个周期。标记为失败的消息进行重新消费也能执行成功。
起初我以为是多个实例共用一个数据库的问题,当我清空Queue并重新运行我的程序时,是正常的,但是我再次重新运行,又会出现这个问题。
现在我的解决方案是将这个几个事件分配到一个新的group,此问题暂时得以解决。

CAP version:2.3.1
.net core version:2.1

由于某些原因我们暂时不能升级至.net coure 2.2 ,所以没有尝试使用最新的版本进行测试

@yang-xiaodong
Copy link
Member

yang-xiaodong commented Dec 25, 2018

你看了异常的链接了吗?
抛出的异常中已经指向了这个issue #63 ,issue中详细描述了问题的原因

多个实例公用一个数据库,需要指定不同的表才行,不能公用相同的表

@lidis
Copy link
Author

lidis commented Dec 25, 2018

我看过这条issue 。我试着unbind Routing key也试着删除过所有的Queue 并重新运行程序,此时他是正常的,但是当我不做任何修改再次运行程序,他便会出现上述的问题。在我测试这些的时候,已经停用了其他实例。

@yang-xiaodong
Copy link
Member

CAP如何在不同的实例中使用相同的数据库?

如果想在不同的实例(程序代码不同)中连接相同的数据库,那么你可以在配置CAP的时候通过指定不同的数据库表名前缀来实现。

你可以通过以下方式来指定数据库表名前缀:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCap(x =>
    {
        x.UseKafka("");
        x.UseMySql(opt =>
        {
            opt.ConnectionString = "connection string";
            opt.TableNamePrefix = "appone"; // 在这里配置不同的实例使用的表名前缀
        });
    });
}

注意:相同的实例不需要指定不同的表名称前缀,他们在接收消息的时候会进行负载均衡。

@yang-xiaodong
Copy link
Member

yang-xiaodong commented Dec 25, 2018

v2.4 以上版本中,理论上可以使用相同的表的,因为引入了新的“版本隔离”特性,通过配置不同的版本号,来实现共享数据表。

但是我还没有做详细的测试,因为这个特性是用来服务不同版本的服务用的,理论上你的这种需求也适合,你可以测试一下。

@lidis
Copy link
Author

lidis commented Dec 25, 2018

多谢解答,可能我表述的不太清楚。现在我已经停用了其他的实例,只有一个实例的情况下也是会出现这个问题,但它并不会在每一个事件上发生。我会在新版本上进行尝试

@yang-xiaodong
Copy link
Member

你需要排查

  1. 事件是哪里发来的,为什么会被订阅到?
  2. 在RabbitMQ控制台查看订阅的Topic是否和代码中一致。
  3. 数据库是否有其他实例有失败的消息,CAP在重试的时候取到了其他实例的消息(因为你共用了数据表,就会有这个问题)?

@yang-xiaodong
Copy link
Member

No response, close

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants