微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使来自数据库的轮询可扩展?

如何解决如何使来自数据库的轮询可扩展?

我正在尝试寻找一种可扩展的方式,以允许我的桌面应用程序在数据库发生更改时运行命令。

该应用程序用于在您的 PC 上运行远程命令。用户登录网站并可以选择运行命令。目前,用户必须下载一个桌面应用程序,每隔几秒钟检查一次数据库,以查看值是否已更改。只有当他们登录网站并按下按钮时才能更改该值。

目前似乎运行良好,因为用户不多。但是当我遇到 100+ 个用户时,每隔几秒钟就访问数据库 100+ 次就不好了。什么是更好的方法

解决方法

轮询更改的成本确实太高了,尤其是在您有很多客户的情况下。查询通常非常昂贵,并且经常运行查询以确保客户端在更改后立即得到通知是很有诱惑力的。最好避免轮询数据库。

上述评论中的一个建议是使用从触发器调用的 UDF。但我不建议这样做,因为触发器会在您执行 INSERT/UPDATE/DELETE 时运行,而不是在您提交更改时运行。因此,客户端可以收到更改通知,然后当他们检查数据库时,更改似乎不存在,因为要么事务已回滚,要么事务尚未提交。

触发器解决方案不好的另一个原因是 MySQL 触发器对每行更改执行一次,而不是对每个 INSERT/UPDATE/DELETE 语句执行一次。因此,如果您执行影响数千行的更新,则可能会导致通知垃圾邮件。

另一种解决方案是使用 message queue,例如 RabbitMQ 或 ActiveMQ 或 Amazon SQS(还有很多其他的)。当客户端提交他们的 INSERT/UPDATE/DELETE 时,他们确认提交成功,然后在消息队列主题上发布一条消息。可以通过这种方式有效地通知许多客户端。但它要求每个提交数据库更改的客户端都编写代码发布到消息队列中。

另一种解决方案是让客户端订阅 MySQL 的二进制日志并将其作为变更数据捕获日志读取。对数据库的每个提交的更改都记录在二进制日志中。您可以让客户端读取此内容,它对数据库服务器的影响并不比复制客户端大(MySQL 可以轻松支持数百个副本)。

混合解决方案是使用二进制日志,并将这些更改转换为消息队列中的事件。这就是像 Debezium 这样的产品的工作原理。它读取二进制日志,并将事件发布到 Apache Kafka 消息队列。然后其他客户端可以等待 Kafka 队列上的事件并响应它们。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。