【问题标题】:Get notified when a row is insert in mysql database在mysql数据库中插入一行时得到通知
【发布时间】:2019-12-26 14:43:49
【问题描述】:

我有一个带有表 bookings 的 MySQL 数据库。当用户在 web api 上进行预订时,该预订的数据将写入此表中。

但在那之后,另一个机器人 (C#) 必须使用这些数据来执行一些网络服务器无法执行的操作。

那么这个机器人如何知道新数据何时添加到数据库表中? 显而易见的答案是让 bot 每隔一秒池一次,看看是否添加了新行。但这听起来非常低效。当有新数据添加到 mysql 表时,还有其他方法可以得到通知吗?

【问题讨论】:

  • triggers 在表中
  • 插入完成后可以使用触发器。或者您可以使用每 1 分钟间隔进行一次数据库调用的实用程序。
  • 如何从 mysql 触发器中获取通知给另一个应用程序?
  • 如果你的数据库是一样的,那么当任何数据被添加到表中时,触发器就会引发

标签: c# mysql .net-core


【解决方案1】:

从外部系统(在您的情况下为 MySQL)接收通知是一个坏主意。您最终将创建一个硬连线基础架构。

轮询每一分钟都更糟。您最终会创建一个非常缓慢且无效的系统。

如果您拥有 WebAPI 代码,您还可以做其他更好的事情。 WebAPI 应该只通过工作单元模式(或 CQRS)保存数据。 工作单元,通过存储库模式和 ORM(实体框架)将了解数据持久性的详细信息(在您的情况下为 MySQL)

我将使用称为域事件的域驱动设计概念来实现它。

Vladimir Khorikov 有一个关于 Pluralsight 主题的精彩课程。

Domain Events Example Code on Github

  1. WebAPI 接收插入数据的请求
  2. WebAPI 触发域事件更改
  3. 域事件更改处理程序使用工作单元或 CQRS 模式将数据插入数据库中。
  4. 应收到新数据到达通知的所有其他组件也应处理此事件并采取相应措施。

总之,考虑切换到领域驱动设计并使用领域事件,您的应用程序将非常灵活、微服务和云就绪。

【讨论】:

  • 我已经这样设置了。太棒了,这不是我想出来的。
【解决方案2】:

如果您不喜欢轮询数据库,这可能是一个完美的解决方案,另一个机器人需要接收有关新数据的消息。这个消息是从哪里来的?您可以从 web api 发送它。如何做到这一点取决于您的第二个机器人是什么类型的东西(服务?)使用触发器对我来说似乎是错误的,因为它需要数据库知道另一个机器人。

【讨论】:

  • 在“谷歌搜索”一段时间后,我认为你是对的。池化可能是最好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 2016-01-24
  • 1970-01-01
相关资源
最近更新 更多