即时消息的频繁数据库查询
Frequent Database Query for Instant Message
我正在为我们的部门创建一个即时消息应用程序。此应用程序的特点是:
- 消息将存储在数据库中
- 消息可以发送给一个、多个或全部users/locations
- 登录用户将能够看到包含他们的消息的历史记录。
我的问题:从每个客户端不断查询数据库是否合适 - 应该少于 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 都有其自身的成本、优缺点和学习时间。因此,从简单开始,留出扩展空间。
我正在为我们的部门创建一个即时消息应用程序。此应用程序的特点是:
- 消息将存储在数据库中
- 消息可以发送给一个、多个或全部users/locations
- 登录用户将能够看到包含他们的消息的历史记录。
我的问题:从每个客户端不断查询数据库是否合适 - 应该少于 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 都有其自身的成本、优缺点和学习时间。因此,从简单开始,留出扩展空间。