如何创建一个通知服务器,在数据库更改时通知 Delphi 应用程序?

Posted

技术标签:

【中文标题】如何创建一个通知服务器,在数据库更改时通知 Delphi 应用程序?【英文标题】:How to create a notification server which informs Delphi application when database changes? 【发布时间】:2011-03-16 09:09:51 【问题描述】:

我们需要能够通知 Delphi 应用程序,以防我们在 mysql 中的某些表发生更改。

Delphi 客户端位于防火墙后面的 Internet 中,它们必须在连接到我们需要实现的通知服务器之前进行身份验证。服务器可以使用 Java、php 或 Python 进行编程,它必须支持数千个客户端。

通常情况下,数据库中的一项更改只需要通知单个客户端,我认为性能不会成为瓶颈。当发生影响特定客户端的更改时,只需能够通知这数千个客户端中的任何一个即可。

我一直在想一个解决方案:

    MySQL 触发器将通知通知服务器 Delphi 客户端连接到消息队列并使用它获取通知

我的问题:

    从触发器通知外部服务器更改的最佳方式是什么 选择哪种消息队列解决方案?

【问题讨论】:

如果您指定了您的服务器操作系统,建议选择哪种消息队列解决方案可能会更容易。 服务器正在运行 Linux,感谢您指出这一点 【参考方案1】:

第一个问题的答案:

在 Stack Overflow 上查看这个问题和答案:

When a new row in database is added, an external command line program must be invoked

理论上,可以使用简单的用户定义函数将“行更改”消息发送到消息代理/队列。但这涉及到可能发生故障的外部系统(至少是网络子系统) - 并且可能会发生坏事。

另一种不需要对数据库系统进行危险修改的解决方案是应用程序的多层设计。承载业务逻辑的服务器应用程序需要生成“数据库内容更改”事件,将它们发布到消息代理上的发布和订阅消息通道(又名“主题”),以便每个客户端都将立即收到此消息的副本或者如果客户端重新连接(使用'durable subscriptions')。


我在这里写了一篇关于这个主题的相关博客文章:Firebird Database Events and Message-oriented Middleware

第二个问题的答案:

Second Life 的创建者评估了几个消息代理并发布了他们的结果 - 对于某些产品,Delphi 客户端库存在或可以使用标准协议实现:Message Queue Evaluation Notes

此后陆续发布了其他产品,其中部分产品还可以通过非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 - Bruce Snyder、Dejan Bosanac 和 Rob Davies 的“ActiveMQ in Action”的免费 introduction chapter

所有代理都是为每秒数千个并发客户端和数万条消息而设计的。它们通常还支持集群和故障转移,尽管这不是 JMS 规范的一部分。

如果速度不是那么重要,但您需要高可用性(即使您的内部系统出现故障),Amazon Simple Queue Service (Amazon SQS) 是一种基于云的服务,可以使用 REST 和 Soap 样式的界面进行访问。

【讨论】:

谢谢,这是很好的信息!我们可能会先尝试 Stomp。基于 JMS 的解决方案对于我们的需求来说相当复杂。 tx :) Stomp 是一个不错的选择,为您的项目带来很大的成功!【参考方案2】:

有 apache camel 和 spring 集成,两者都提供了一些发送消息的方法。

【讨论】:

【参考方案3】:

为什么不使用 XMPP 协议(​​又名 Jabbber)?

【讨论】:

以上是关于如何创建一个通知服务器,在数据库更改时通知 Delphi 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

通知iOS和Android服务器上的数据更改

如何在前台(顶部)活动(应用程序)更改时收到通知

收到推送通知时如何更改范围变量

iOS - 在收到推送通知事件时更改视图的内容

如何在推送通知中更改应用程序的名称?

当实体集 ChangeTracker 发生更改时如何通知 UI