我需要在django中开发一个实时的活动提要(使用AJAX长轮询),我想知道服务器端的最佳策略是什么。
伪码:
def recent_activity_post_save():
notify_view()
[in the view]
while not new_activity():
sleep(1)
return HttpResponse(new_activity())想到的第一件事是每秒查询DB。不可行。其他备选方案:
这里最好的方法是什么?
发布于 2011-10-02 19:08:22
我建议保持简单..。
创建一个数据库表来存储您的事件,并在适当的时候插入到该表中,然后实现一种简单的ajax轮询技术,每隔x秒在客户端访问服务器。
我担心其他解决方案考虑使用推送通知方法或使用noSql数据存储。它比使用Django框架内置的工具的传统的拉式通知系统复杂得多,除了非常罕见的例外,这是过分的。除非你特别需要一个严格的实时解决方案,保持简单,使用框架中已经存在的工具,对于那些基于数据库或网络性能有异议的人,我要说的是,过早的优化是万恶之源。
构建一个包含特定于应用程序的最近活动数据的模型,然后,每当您的应用程序做了应该记录新活动的事情时,就可以插入到这个表中。
您的视图将与任何其他视图一样,从这个RecentActivity表中提取顶部的x行(可选地基于查询参数等)。
然后,在客户端,您将有一个简单的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);
});
}我的意见是,性能问题并不是真正的问题,直到你的网站成功到足以成为一个问题。一个传统的关系数据库可以很好地扩展,直到你开始达到像Twitter、Google等成功的水平。我们大多数人都没有达到这个级别:)
发布于 2011-09-28 14:08:55
你考虑过用信号吗?您可以在recent_activity_post_save()中发送信号,并且可以有一个侦听器将信息存储在缓存中。
视图将只引用缓存来查看是否有新的通知。当然,您不需要信号,但是IMHO这样会更干净一些,因为您可以添加更多的“通知处理程序”。
这似乎是最优的,因为您不需要轮询DB (人工加载),通知几乎立即“可见”(仅在处理信号和与缓存交互所需的时间之后)。
所以伪码看起来是这样的:
# 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(...)发布于 2011-09-18 08:28:28
您可以使用彗星解决方案,如Ape项目。该项目旨在向浏览器发送实时数据,并利用现代浏览器的网页套接字功能。
https://stackoverflow.com/questions/7460149
复制相似问题