使用 django-channels/websocket 更新实时位置的有效方法

Posted

技术标签:

【中文标题】使用 django-channels/websocket 更新实时位置的有效方法【英文标题】:Efficient way of updating real time location using django-channels/websocket 【发布时间】:2019-08-09 09:17:02 【问题描述】:

我正在开发基于实时的应用程序,它需要在更改时更新用户的位置。

android 应用 用作前端,使用 Google/Fused Api 和@987654321 获取位置@,我正在通过 Websocket 发送最新位置。 django 频道消费者 接收位置更新,该消费者的工作是将位置异步存储在数据库中(我正在使用@database_sync_to_async 装饰器。

但问题是,当 Android 应用尝试每秒发送 10-15 个位置更新时,服务器会崩溃。更新实时位置的有效方法是什么?

注意:代码可按需提供

【问题讨论】:

【参考方案1】:

问问自己,您需要什么样的分辨率来处理这些数据。你真的需要每秒更新 10 次吗?如果没有,请每隔 n 次更新一次,或者看看 Android 是否只会让您的更新速度变慢。其次,寻找一个原生的异步数据库库。 @database_sync_to_async 每次调用它时都会运行一个不同的线程,这会扼杀你从事件循环中获得的性能提升。如果您说在一个线程中,您将保持 CPU 缓存新鲜。您将无法使用 ORM。但是你真的需要一个数据库还是 Redis 可以工作?如果是这样,直接调用aioredis,它会更快,因为它在内存中,你可以使用它的快速数据结构,如队列和集合。如果您需要 Redis 更快,请查看它的多线程 fork KeyDB。

【讨论】:

以上是关于使用 django-channels/websocket 更新实时位置的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)