轻量级通知技术

Gab*_*aru 12 python django rabbitmq celery greenlets

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

伪代码:

def recent_activity_post_save():
    notify_view()

[in the view]
while not new_activity():
    sleep(1)
return HttpResponse(new_activity())
Run Code Online (Sandbox Code Playgroud)

首先要记住的是每秒查询数据库.不可行.其他选择:

  1. 使用缓存作为通知服务
  2. 使用像芹菜这样的专业工具(我宁愿不这样做,因为它看起来有点矫枉过正)

什么是最好的方式去这里?

DMa*_*yer 5

我建议保持简单......

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

考虑使用推送通知方法或使用noSql数据存储,我对其他解决方案感到担忧.它比使用Django框架内置的工具的传统拉动通知系统复杂得多,除了非常罕见的例外,它是过度的.除非您特别需要严格的实时解决方案,请保持简单并使用框架中已存在的工具,对于基于数据库或网络性能的反对者,我不得不说的是,过早优化是根本原因.万恶之物

构建一个包含特定于您的应用程序的最新活动数据的模型,然后,只要您的应用程序执行了应该记录您可以插入此表的新活动的内容.

您的视图将像任何其他视图一样,从此表中拉出前xRecentActivity(可选择基于查询参数等).

然后,在客户端,你只需要一个简单的ajax轮询器每隔x秒就能看到你的视图.您可以使用复杂的插件和技术,但编写自己的插件和技术并不复杂:

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);
  });
}
Run Code Online (Sandbox Code Playgroud)

我的观点是,在您的网站成功完成问题之前,性能问题并不是真正的问题.传统的关系数据库可以很好地扩展,直到你开始达到Twitter,谷歌等成功的水平.我们大多数人都没有达到这个水平:)