django - 将数据生产者作为工作人员集成到 Django Channels 2.x
问题描述
我正在开发一个应用程序,其中将推送给客户端的实时数据将来自外部 API。它的一个简单版本可以被认为是一个外汇货币跟踪器。用户将指定她想要跟踪的货币(美元、欧元、英镑等)并接收实时更新。货币数据将通过长轮询来自外部 API。我的问题是如何将此数据生产者集成到渠道中?
在所有频道示例中,我发现工人的工作是由事件触发的,但在我的情况下,它将从一开始就开始,持续工作,而不是接收事件,它只会将新值推送到频道层,以便通知订阅者。所以我不确定消费者模式是否正确。总结我的问题:
我应该使用消费者来完成这项任务以及如何设置它?考虑将通过长轮询异步或同步消费者访问 API?开始在其连接方法中轮询外部 API,还是只为此发送一个一次性事件?从何处以及何时发送此“开始工作”事件?
我还想使用 redis 来存储用于向用户提供货币初始值的值。他们将开始在连接时侦听更新,但可能会在几秒钟后更新。我可以访问通道层使用的 redis 连接实例,还是需要为此目的打开到我的 redis 的另一个连接?
数据生产者的另一个选择可以将其完全保留在 Django 通道之外,如此处所述,只是将数据推送到通道层,但我不确定在部署过程中可能会出现 daphne 的问题。我的意思是如何确保它保持正常运行并与渠道很好地共享资源?
谢谢。
解决方案
工人适合您的用例。它们意味着长期运行,并且每个请求都没有新实例。如果你想让你的消费者异步,你必须确保你所做的任何事情都不会阻塞。所有 db 查询都必须包含在 database_sync_to_async 中,即使 db 调用发生在调用堆栈的 5 个级别。您可以使用 Django 缓存 API 连接到 Redis,但最好在它之外工作以保持一切异步。直接使用 redis 库通道使用,因为它具有将 redis 用作缓存的异步方法。
推荐阅读
- javascript - 如何将 FlatList 项目传递给模态?
- ssl - Tomcat,从 -D 选项中隐藏 javax.net.ssl.keyStorePassword
- python - 如何使用 LDAP 身份验证将 pySpark SQL 连接到远程 Hive 服务器
- node.js - 使用 React、Node.js 和 Socket.io (v 4.0.0) 时如何修复 CORS
- node.js - Mongoose 聚合管道:与自己的对象进行比较
- vb.net - VSTO:如何将自定义任务窗格设置为始终位于最右边的窗格
- xamarin - 如何在 xamarin 表单 UWP 中使用 AppWindow 打开多个窗口?
- javascript - 如何检测“net::ERR_CONNECTION_REFUSED”
- vue.js - 当表格由 vue v-for 填充时,我可以使表格可排序吗?
- error-handling - 如何防止 MVC5 自动将 fTrySkipCustomErrors 标志设置为 true