我的问题涉及以下用例:
用例参与者
- 用户A:设置广播区域并查看带直播帖子的流的用户。
- 用户 B:在用户 A 设置的广播区域内第一个发送广播消息的用户。
- 用户 C:在用户 A 设置的广播区域内发送广播消息的第二个用户。
用例描述
- 用户A选择一个广播区域,在其边界(半径)内他想要接收直播消息。
- 用户 A 打开 livefeed 并请求一组初始 livefeed 项目。
- 用户 B 从用户 A 的广播区域内广播一条消息,而用户 A 的 livefeed 仍处于打开状态。用户 A 的实时源打开时,带有 1 个新实时源项目的标签会显示在其顶部。
- 当用户 C 从用户 A 的选定广播区域内发布另一个实时馈送帖子时,标签计数器会增加。
我想应用的解决方案(我认为 Pubnub 使用)是为每个 geohash 创建一个主题。
在我的情况下,这意味着对于广播消息的每个用户,它都需要发布到 geohash-topic,如果它落在范围内,客户端(应用程序/网站用户)将通过 websocket 使用 geohash-topic定义的区域(半径)。Ably 似乎使用 Web 套接字提供这种可扩展的服务。
我想它会简化成这样:
因此,这意味着需要从发送广播消息的当前位置提取 geohash。这个 geohash 应该具有足够小的粒度,以便接收用户可以设置或多或少准确的广播区域。(即,如果我们希望允许用户定义接收实时消息的广播区域,geohash 应该具有足够的准确性,这意味着如果我们决定扩展,人们应该期望有相当多的主题)。
选项 2 是为粒度较小(覆盖较大区域)的 geohash 创建主题,并让客户端根据与消息一起发送的 latlng 值来处理准确性。
然后客户端将决定是否丢弃消息。但是,这意味着发送更多消息(更多开销)和更高成本。
我没有这种架构的经验,并且质疑这种方法的可行性/可扩展性。
您能否想到这个问题的替代解决方案以达到预期的结果或提供更多关于如何整体解决此类问题的见解?(我也考虑过使用常规的 req-res 流,但这意味着向服务器发送垃圾邮件,这似乎也不是一个很好的解决方案)。
我确实查过了。
给定一个 161.4 平方公里的区域(如布鲁塞尔区域),geohashes 按字符串长度划分如下:
1 ≤ 5,000km × 5,000km
2 ≤ 1,250km × 625km
3 ≤ 156km × 156km
4 ≤ 39.1km × 19.5km
5 ≤ 4.89km × 4.89km
6 ≤ 1.22km × 0.61km
7 ≤ 153m × 153m
8 ≤ 38.2m × 19.1m
9 ≤ 4.77m × 4.77m
10 ≤ 1.19m × 0.596m
11 ≤ 149mm × 149mm
12 ≤ 37.2mm × 18.6mm
鉴于我们将允许用户可能有高达 153m 的不准确性(在用户可能希望订阅以接收本地广播消息的区域),这将需要大量的主题,这些主题肯定已经太大,甚至无法仅涵盖布鲁塞尔的整个地区。
所以我目前仍然有点卡在这个水平上。