在等待数据库更新时使用带超时的Websockets或ajax



当任何事件发生时,我的应用程序都会通过在数据库中添加一个条目来更新。这是通过一个独立的代码异步完成的。

现在,使用PlayFramework(Java),我想向客户端显示按逆时间顺序列出的事件(最新的第一个)。

我最初考虑使用前端将连接到的websocket,但这需要服务器每n分钟查询一次数据库以检查新条目,并在存在时返回它们。

我开始怀疑用setInterval发出ajax请求是否不是一个更好/更简单的选择(考虑到同样的想法:查询api以询问从date={last-query-time}开始的最新事件)。

谢谢你的帮助。

如果可能的话,我认为您最好考虑将其作为事件驱动,而不是考虑性能和体系结构进行定期查询。第一件事是使用数据库管理系统的触发器(AFAIK,一些数据库管理系统通过触发器提供执行web服务,但我不确定是否需要)或原始应用程序的侦听器(如@PostPersist),根据Play通知应用程序服务器数据库的更改(如果它在同一个Java进程上,您可以使用一些静态或DI支持的侦听器。如果不是,您可以执行HTTP请求)。

现在您正在侦听数据库的更改,您需要一种方法来通知感兴趣的客户端该更改。您可以选择任何称为WebSocket或Comet的技术来实现这一点。然而,在我看来,最简单的选择是采用精心制作的框架来进行这种使用。由于我是Cettia的作者,我给你举了一个用Cettia写的例子,但你也可以在其他项目中这样做,比如气氛游戏。

// Assumes you are notified of database changes through this listener
// However, it doesn't matter
public class SomeEntityListener {
    // Assumes you are using Dependency Injection framework like Spring or CDI
    // so you can inject io.cettia.Server to anywhere you want to handle clients
    @Inject
    Server server;
    // This method is called after persisting of some entity
    @PostPersist
    public void postPersist(SomeEntity e) { 
        // Broadcasts just a persisted entity to interested clients
        // No matter how you are notified of database event, only this line is necessary
        server.byTag("someentity-subscribers-postpersist", e);
    }
}

有关如何安装Cettia,请参阅此快速入门指南和Play的工作示例。当然,你可以用普通的WebSocket做到这一点,但它不是银弹。(这就是为什么在各种语言和平台中出现了如此多的框架)

是的,您的第一个选择更好,因为它不需要每n分钟轮询一次,因为您的应用程序运行在服务器上,可以使用某些API通知该服务器,当数据库更新时会触发该API。

Websocket将在浏览器和播放应用程序之间创建一个通道,该通道由两个通道组成,一个用于入站,另一个用于出站。在创建websocket的后台应用程序上,我们可以将事件侦听器附加到入站通道,该事件侦听器将根据从浏览器端在入站通道中接收到的数据触发回调。

因此,我们可以创建一个API,它将在更新时从数据库触发,API将在websocket的出站通道上写入数据。

使用这种方法将帮助您删除数据库上的大量轮询。

最新更新