首页 > 解决方案 > 使用 django-channels/websocket 更新实时位置的有效方法

问题描述

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

Android 应用程序用作前端,它使用Google/Fused Api获取位置,onLocationChanged(loc:Location)我通过Websocket发送最新位置。然后位置更新由django 频道消费者接收,该消费者的工作是将位置异步存储在数据库中(我正在使用@database_sync_to_asyncdecorator.

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

注:代码可按需提供

标签: pythondjangowebsocketdjango-channels

解决方案


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


推荐阅读