即时消息的频繁数据库查询

Frequent Database Query for Instant Message

我正在为我们的部门创建一个即时消息应用程序。此应用程序的特点是:

  1. 消息将存储在数据库中
  2. 消息可以发送给一个、多个或全部users/locations
  3. 登录用户将能够看到包含他们的消息的历史记录。

我的问题:从每个客户端不断查询数据库是否合适 - 应该少于 20 个客户端 运行 - 比如说每 15 - 30 秒左右?我看过使用 tcipclient 的 server/client 消息传递应用程序示例,但我不熟悉该主题。所以我认为查询数据库可能是我可以采用的方法。如此频繁地执行这些查询会产生什么后果?我也在看 sqldependencies???我真的应该回去尝试学习tcip技术吗?

谢谢

如果您知道您将始终拥有数十个客户端而不是数千个客户端的顺序,那么轮询就可以正常工作,并且您不必每 15 秒轮询一次,(它如果你这样做将无法使用,)你可以每 100 或 200 毫秒轮询一次,因此聊天将是即时的。

只要确保每个轮询操作尽可能简单即可。你可以做的最简单的操作是:

SELECT * FROM chat_log WHERE chat_log.id > ? 其中 id 是您的 IDENTITY 主键,? 是您的客户端到目前为止从服务器看到的最后一个 ID。因此,如果没有新的聊天消息,则不会检索任何行。对于客户端检索到的每一行,更新客户端迄今为止看到的最大 ID,然后就可以开始了。

我已经做到了,效果非常好。

从技术的角度来看,轮询是一种非常可忽略的技术,但在许多情况下,它可能是一种实用的折衷方案,可能会产生足够好的结果而无需进行任何开发。 (另一种方法是创建一个合适的聊天服务器,向客户端发送推送通知,祝你好运。)

如果少于 20 个客户端(20 select 每 20 秒查询 + 一些写入),SQL 服务器处理这些消息将没有问题。

工具和技术的选择取决于您的实际需求。 (消息大小,允许文件传输,delete/edit 条消息...)

我可以建议几个选项来提高性能,

  • 阅读消息 - 您可以对最近的消息(最近 30 天)使用缓存(例如 Azure Redis 缓存)。您可以提出后台缓存更新策略,以确保它不断更新新消息。读取消息会先调用缓存,只有缓存未命中才会访问数据库。

您还可以创建本地消息缓存(客户端),这将显着提高最终用户的性能。您可以为此创建一个 SQLite(就像 Skype 那样。Win + R -> %appdata%\skype -> 文件夹 -> main.db)

或者您可以简单地在您的数据库中有一个存档 table,其中一个预定的(每 24 小时)后台进程存档超过 14/30 天的消息。所以你会收到最近的消息

  • 写入 - 写入消息会比较麻烦,而不是直接更新数据库,您可以使用消息队列(Azure 消息队列、Rabbit MQ 等)。然后你可以有另一个进程将消息写入数据库。

每种技术 selection 都有其自身的成本、优缺点和学习时间。因此,从简单开始,留出扩展空间。