如何创建一个通知服务器,在数据库更改时通知Delphi应用程序?
我们需要让一个Delphi应用程序在MySQL中的某些表发生变化时能够收到通知。
Delphi客户端在互联网的防火墙后面,连接到我们需要实现的通知服务器之前,必须进行身份验证。这个服务器可以用Java、PHP或Python等编程语言来编写,并且需要支持成千上万的客户端。
通常,数据库中的一次变化只需要通知一个特定的客户端,我认为性能不会成为问题。关键是当某个特定客户端受到影响时,能够通知到成千上万的客户端中的任何一个。
我在考虑一个解决方案,其中:
- MySQL触发器会通知到通知服务器
- Delphi客户端连接到一个消息队列,并通过它获取通知
我有几个问题:
- 从触发器到外部服务器通知变化的最佳方式是什么?
- 应该选择哪种消息队列解决方案?
3 个回答
为什么不使用XMPP协议(也叫Jabber)呢?
有Apache Camel和Spring集成,这两者都提供了一些方法来发送消息。
对第一个问题的回答:
可以查看这个问题和在Stack Overflow上的回答:
理论上,可以使用一个简单的用户定义函数来发送“行已更改”的消息到消息中介或队列。但这涉及到外部系统(至少需要一个网络系统),这些系统可能会出现故障,可能会导致一些不好的事情发生。
一个不需要对数据库系统进行危险修改的不同解决方案是采用多层设计的应用程序。托管业务逻辑的服务器应用程序需要生成“数据库内容已更改”的事件,并将其发布到消息中介上的发布-订阅消息通道(也叫“主题”),这样每个客户端都会立即收到这条消息,或者在客户端重新连接时收到(使用'持久订阅')。
我写了一篇相关的博客文章,可以在这里查看:Firebird数据库事件和面向消息的中间件
对第二个问题的回答:
Second Life的创建者评估了一些消息中介,并发布了他们的结果——对于某些产品,存在Delphi客户端库,或者可以使用标准协议实现:消息队列评估笔记
从那时起,其他产品也相继发布,其中一些也可以通过非Java协议与Delphi客户端集成,例如:
- Open Message Queue (OpenMQ) 4.4,这是Sun GlassFish v3应用服务器中的默认JMS提供者中介
- JBoss HornetQ 2.1,将成为JBoss应用服务器6中的默认JMS提供者。HornetQ 2.0.GA在相同的服务器硬件和操作系统设置下,得分比之前发布的SPECjms2007基准结果高出307%。
一个非常流行的开源消息中介,可以从Delphi、Java、PHP、C#(以及其他)客户端使用的是:
- Apache ActiveMQ 5.4.1 - 免费的《ActiveMQ in Action》的介绍章节,由Bruce Snyder、Dejan Bosanac和Rob Davies撰写
所有中介都设计用于支持成千上万的并发客户端和每秒数万条消息。它们通常还支持集群和故障转移,尽管这不是JMS规范的一部分。
如果速度不是特别重要,但你需要高可用性(即使你的内部系统出现故障),亚马逊简单队列服务(Amazon SQS)是一个基于云的服务,可以通过REST和Soap风格的接口访问。