【发布时间】:2011-09-28 20:48:04
【问题描述】:
我需要在 Django 中实现一个基于 XMPP 的实时聊天系统。经过一位同事的大量鞭挞和想法,我们想出了这个。
使用机器人的方法:
- 当访问者访问该站点时。访问者的 XMPP 客户端(在本例中为 Strophe.JS)开始与 XMPP 服务器建立 XMPP-over-BOSH 连接,并连接到名为
<visitor_id>@conference.demo.com的房间。目前房间里没有其他人。 - 访问者使用自定义访问者 ID 向 Django 发出分析请求
- Django 视图将访问者 ID 存储在名为
ActiveUsers的表中。此表包含一个名为status的新字段。它将status设置为INACTIVE。 - 此模型在
save方法上调度信号。 - 此信号被连接到 XMPP 服务器并加入房间
<visitor_id>@conference.demo.com的机器人接收。现在我们在房间里有了用户和机器人。 - 网站支持人员登录到他们的网络界面。
- 他们的 JS 代码不断地对 Django 站点进行长时间轮询以检查
ActiveUsers。它从表中获取行并显示它。 (我曾想过为此使用django-pubsub) - 当访客键入消息时,它通过 XMPP-over-BOSH 到达 XMPP 服务器,房间中的 jabber 机器人看到此消息并将
ActiveUsers表中的记录状态更新为ACTIVE。 - 如前所述:网站支持人员有 JS 不断轮询此表。它开始闪烁 ow,表明用户正在聊天。
- 支持人员现在可以双击该行,这样做会开始与访客房间的 XMPP-over-BOSH 连接。它知道房间是
<visitor_id>@conference.demo.com。 - 机器人看到支持人员已加入房间,更新
ActiveUsers记录以显示CHATTING。这确保了房间内最多只能有支持人员,即有人在房间内。 - 机器人将消息记录到 Django 表中
- 当两者都看到两个用户都离开了房间时,它会删除记录。
ejabberd 或 openfire 将是 XMPP 服务器。 Apache 是一个 web 服务器,它运行 mod_wsgi 为 Django 提供服务,mod_proxy 将 XMPP-over-BOSh 请求代理到 XMPP 服务器。
这样做听起来不错吗?有什么建议?我担心 Django 系统的负载。
(很长。抱歉。)
使用存在节的方法:
在客户端,我正在使用支持存在的 Strophe JS 库,并且我添加了回调方法。我可以灵活地使用 ejabberd 或 openfire 作为我的 XMPP 服务器。 XMPP 服务器上有很多访问者——一些来自站点 A,一些来自站点 B,但他们都连接到同一个 XMPP 服务器。当访问者访问该站点时,他们以<visitor_id>_<site_id>@demo.com 的身份连接到XMPP 服务器,并且每个人都登录到一个名为<visitor_id>@conference.demo.com 的房间。销售/支持人员也以<supportsale_id>_<site_id>@demo.com 连接到XMPP 服务器。他们虽然没有连接到任何聊天室。他们的名单上没有任何访客。
显示用户已连接到该网站的一个好方法是将一个存在节传递给销售/支持人员。只有来自同一站点的访问者和销售/支持人员才能相互交流,这就是为什么我在用户名中使用 <site_id> 来显示该人所属的站点。
如果您的花名册上没有用户,您似乎无法为该用户订阅出席信息节。 (非常合乎逻辑)。是否可以自动将连接到系统的站点的每个新用户添加到该站点的销售/支持人员名册中?这不会自动向销售/支持人员发出存在信号吗?我该如何实现这个——有什么帮助吗?
【问题讨论】: