通知db INSERT上的应用程序

时间:2010-07-22 01:29:51

标签: mysql database triggers message-queue

考虑具有两个组件的应用程序,可能在不同的机器上运行:

  • 制作人 - 将记录插入到 数据库,但几乎没有从数据库读取。 可能正在运行多个实例 同时进行。
  • 消费者 - 在插入记录时必须通知 数据库由组件实例组成 A.也可能有多个实例。

执行通知的最佳方式是什么,假设生产者在高峰时间每秒会向数据库中插入10-100条记录?数据库技术目前是MySQL,但这不一定是一成不变的。我可以看到几种不同的方式:

  • 使用MySQL message queue之类的东西将“推送”INSERT通知“推送”给订阅者(消费者)。生产者不会知道这种情况正在发生。
  • 让生产者与执行INSERT的中间层进行交互,并将通知推送到消费者订阅的消息队列。
  • 让消费者经常轮询数据库以检查新增内容(似乎是一个坏主意)

就耦合而言:让两个相对独立的应用程序组件对共享数据库执行直接查询是一个好主意,还是一个组件“拥有”数据库而另一个组件通过另外的组件间接地与数据库交互调用拥有组件?

1 个答案:

答案 0 :(得分:1)

我喜欢第二个提出的解决方案(中间层),因为它将通知与数据库工作分开,并且可能是两阶段提交XA事务的一部分。如果消费者除了通知之外还需要数据库内容,那么可以通过MySQL复制来完成。这也可以解决耦合问题,因为消费者组件可以具有对其复制实例的只读访问权。

使用消息传递解决方案还可以解决仅数据库解决方案中的任何潜在瓶颈问题,因为它会将通知和存储分离到单独的进程中。

根据语言的不同,您可以选择多种消息。如果您正在使用Java,我实际上建议使用JGroups而不是JMS,因为它更容易配置。

如果Java不是您选择的语言,那么Apache的Active MQ支持多种语言进行接口连接。 Apache的Qpid是一个AMQP实现,它还支持多种语言(Java,C ++,Python,Ruby等)。

其他消息传递选项可能包括XMPP,STOMP或RestMS实现。