首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >轻量级通知技术

轻量级通知技术
EN

Stack Overflow用户
提问于 2011-09-18 07:41:31
回答 8查看 2.2K关注 0票数 11

我需要在django中开发一个实时的活动提要(使用AJAX长轮询),我想知道服务器端的最佳策略是什么。

伪码:

代码语言:javascript
复制
def recent_activity_post_save():
    notify_view()

[in the view]
while not new_activity():
    sleep(1)
return HttpResponse(new_activity())

想到的第一件事是每秒查询DB。不可行。其他备选方案:

  1. 将缓存用作通知服务
  2. 使用一种专门的工具,比如芹菜(我不想这么做,因为它看起来太过分了)

这里最好的方法是什么?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-10-02 19:08:22

我建议保持简单..。

创建一个数据库表来存储您的事件,并在适当的时候插入到该表中,然后实现一种简单的ajax轮询技术,每隔x秒在客户端访问服务器。

我担心其他解决方案考虑使用推送通知方法或使用noSql数据存储。它比使用Django框架内置的工具的传统的拉式通知系统复杂得多,除了非常罕见的例外,这是过分的。除非你特别需要一个严格的实时解决方案,保持简单,使用框架中已经存在的工具,对于那些基于数据库或网络性能有异议的人,我要说的是,过早的优化是万恶之源。

构建一个包含特定于应用程序的最近活动数据的模型,然后,每当您的应用程序做了应该记录新活动的事情时,就可以插入到这个表中。

您的视图将与任何其他视图一样,从这个RecentActivity表中提取顶部的x行(可选地基于查询参数等)。

然后,在客户端,您将有一个简单的ajax计票器每隔x秒点击一次视图。您可以使用的复杂插件和技术并不短缺,但编写自己的插件和技术也不那么复杂:

代码语言:javascript
复制
function simplePoll() {
  $.get("your-url", {query-parameters}, function(data){
    //do stuff with the data, replacing a div or updating json or whatever
    setTimeout(simplePoll, delay);
  });
}

我的意见是,性能问题并不是真正的问题,直到你的网站成功到足以成为一个问题。一个传统的关系数据库可以很好地扩展,直到你开始达到像Twitter、Google等成功的水平。我们大多数人都没有达到这个级别:)

票数 5
EN

Stack Overflow用户

发布于 2011-09-28 14:08:55

你考虑过用信号吗?您可以在recent_activity_post_save()中发送信号,并且可以有一个侦听器将信息存储在缓存中。

视图将只引用缓存来查看是否有新的通知。当然,您不需要信号,但是IMHO这样会更干净一些,因为您可以添加更多的“通知处理程序”。

这似乎是最优的,因为您不需要轮询DB (人工加载),通知几乎立即“可见”(仅在处理信号和与缓存交互所需的时间之后)。

所以伪码看起来是这样的:

代码语言:javascript
复制
# model
def recent_activity_post_save():
    post_save_signal.send()

# listener
def my_handler( ... ):
    cache.set( 'notification', .... )

post_save_signal.connect( my_handler )

# view
def my_view( request ):
    new_notification = None
    while not new_notification:
        sleep(1)
        new_notification = cache.get( 'notification' )
    return HttpResponse(...)
票数 2
EN

Stack Overflow用户

发布于 2011-09-18 08:28:28

您可以使用彗星解决方案,如Ape项目。该项目旨在向浏览器发送实时数据,并利用现代浏览器的网页套接字功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7460149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档