设计:首先将记录推送到数据库,然后从数据库中选择并推送到rabbitmq,这样正确吗

设计:首先将记录推送到数据库,然后从数据库中选择并推送到rabbitmq,这样正确吗,rabbitmq,Rabbitmq,我们是一个电子商务网站,有几个列表。可以从各种应用程序中创建/更新/删除列表:-即桌面、移动、应用程序 我们需要将所有这些更新信息推送到一些第三方API,即创建/删除的任何新列表,或者如果现有列表更新,我们需要通过一些第三方API推送完整的列表信息。我们使用Rabbitmq来实现这一点,因为我们预期会有大量的记录更新 我们有两个选择: 从所有端点(desk/msite/app)信息(listingId、列表操作,即创建/更新/删除)推送到rabbitmq。Rabbitmq进一步将这些消息出列,

我们是一个电子商务网站,有几个列表。可以从各种应用程序中创建/更新/删除列表:-即桌面、移动、应用程序

我们需要将所有这些更新信息推送到一些第三方API,即创建/删除的任何新列表,或者如果现有列表更新,我们需要通过一些第三方API推送完整的列表信息。我们使用Rabbitmq来实现这一点,因为我们预期会有大量的记录更新

我们有两个选择:

  • 从所有端点(desk/msite/app)信息(listingId、列表操作,即创建/更新/删除)推送到rabbitmq。Rabbitmq进一步将这些消息出列,并点击相应的API
  • 在listings表上实现触发器,即在创建时,将条目插入到具有列的某些表中(listingId,要执行的数据库操作,即创建/更新/删除)。现在,每10秒创建一个从该表读取的作业。然后把这些推给rabbitmq

哪一个更好?我认为基于HTTP的API可能是最好的解决方案。您可以实现一个网关,其中包括安全性(OAuth2/SAML)、速率限制等。您可以在内部使用RabbitMQ。网关可以将更新发布到RabbitMQ,并拥有将数据写入主数据库的订阅服务器和将数据发布到第三方API的其他订阅服务器

除了可用的额外安全控制之外,HTTP网关的额外好处是,您可以在未来改变对RabbitMQ的看法,而不会影响您的桌面和移动应用程序,因为这些应用程序很难全部更新

在我职业生涯的大部分时间里,我都在使用数据库,因此我倾向于避免触发。特别是如果您希望有大量的更新。我过去曾遇到过触发器的性能问题和可靠性问题


值得注意的是,RabbitMQ确实存在消息复制问题——没有一次完全交付的保证。因此,您需要实施自己的重复数据消除,或者最好使所有操作都是幂等的

我认为基于HTTP的API可能是最好的解决方案。您可以实现一个网关,其中包括安全性(OAuth2/SAML)、速率限制等。您可以在内部使用RabbitMQ。网关可以将更新发布到RabbitMQ,并拥有将数据写入主数据库的订阅服务器和将数据发布到第三方API的其他订阅服务器

除了可用的额外安全控制之外,HTTP网关的额外好处是,您可以在未来改变对RabbitMQ的看法,而不会影响您的桌面和移动应用程序,因为这些应用程序很难全部更新

在我职业生涯的大部分时间里,我都在使用数据库,因此我倾向于避免触发。特别是如果您希望有大量的更新。我过去曾遇到过触发器的性能问题和可靠性问题


值得注意的是,RabbitMQ确实存在消息复制问题——没有一次完全交付的保证。因此,您需要实施自己的重复数据消除,或者最好使所有操作都是幂等的

+1。反对触发器解决方案的另一点是:如果有人稍后在一行中编写一个过程,在一个事务中多次更新
列表中的条目,该怎么办?您的
列表\u updates
表现在包含在任何时间点都不存在的更新。。。换句话说,很难区分触发器中的“真实”更新和“中间”更新是什么组成的。您没有太多的上下文。此外,数据库/触发器解决方案要求您维护另一个消息队列(手动滚动的数据库表!),如果您发现自己需要“精确一次交付”保证,您将发现自己处于一个棘手的位置。如果你的投票服务崩溃了怎么办?如果轮询服务无法到达rabbitMQ?如果轮询服务可以到达rabbitMQ,但之后无法清除表?比看起来更难。反对触发器解决方案的另一点是:如果有人稍后在一行中编写一个过程,在一个事务中多次更新
列表中的条目,该怎么办?您的
列表\u updates
表现在包含在任何时间点都不存在的更新。。。换句话说,很难区分触发器中的“真实”更新和“中间”更新是什么组成的。您没有太多的上下文。此外,数据库/触发器解决方案要求您维护另一个消息队列(手动滚动的数据库表!),如果您发现自己需要“精确一次交付”保证,您将发现自己处于一个棘手的位置。如果你的投票服务崩溃了怎么办?如果轮询服务无法到达rabbitMQ?如果轮询服务可以到达rabbitMQ,但之后无法清除表?比看起来更难。