使用Firebase实现半径内公共聊天室(请求建议)

13

我想在我的应用程序中集成一个公共聊天室,但是我不知道如何创建后端。

我的应用程序使用Firebase,对于两个用户或一组用户之间的简单设置很简单。我基于 Firebase 中的参考点创建一个私人房间,允许该组中的用户访问消息。

现在假设我在洛杉矶,我希望用户能够与其位置(lat/lng)半径为1英里内的其他用户聊天。我知道这是可能的,因为有一个应用程序可以实现这一点,可以在https://itunes.apple.com/sg/app/popcorn-messaging/id718416705?mt=8找到。

如果你想知道我尝试了什么,请阅读以下内容。可能有点混乱。

我考虑实现的一种方法是在全球范围内创建一个每英里一次的聊天室。例如,从 lat:0, lng:0 开始,然后向右移动一英里,再向右移动一英里等等。但是这样做更加糟糕,我将有数百万个没有被使用的聊天室。

我认为可以实施的第二种方法是:如果不存在用户半径内的聊天室,则创建一个。因此,如果我在洛杉矶,并且没有聊天室,则会在该位置创建一个聊天室,假设如果另一个人去洛杉矶,因为在1英里范围内已经创建了聊天室,它将加载该用户的聊天室。

非常感谢任何建议。

2个回答

5
如果你确定想要设置为1英里乘1英里或任何类型的固定距离,我认为全球预定义聊天室(以一英里间隔)是更好的选择。这将更简单,因为添加新用户和避免人们移动位置时重叠会更加容易。如果您正在使用Firebase,并且正确扁平化数据,则拥有空房间不会对您造成太大损失。
唯一的原因可能是担心聊天室变得太满或太空。我不确定这是否是您的应用程序所关注的问题,但这肯定是具有预定义位置的缺点。即使这样,您也可以根据房间中的人数进行缩减(分割房间)或扩大规模(合并房间)。
希望这有所帮助。如果您需要更多指导,请告诉我们一些关于您的应用程序的信息?
更新:我明白你的意思。经过进一步的思考,我仍然认为预先确定区域是最好的方式。即使您突发创建新区域,也将存在一个需要分割房间(绘制房间之间的边界)的点,而在该线两侧的用户,即使他们彼此紧挨着,也将位于不同的房间中。
如果只基于纬度/经度和半径周围的用户,那么也可能会产生奇怪的结果。例如,如果B用户与A和C用户在一个房间中,但A和C用户相距太远,他们可能会看到一些非常奇怪的聊天消息。例如,如果该半径为1英里,UserA可以在Mile 0处,UserB可以在Mile 1处,而UserC可以在Mile 2处。因此对于UserA(只能看到UserA和UserC),聊天可能看起来像这样:
User A: Hello there! What is 2+2?
User B: 4
User A: Thank you!
User B: George Washington
User A: What?!?!

对于仅有权查看所有消息的User B来说,它可能会显示如下:

User A: Hello there! What is 2+2?
User B: 4
User A: Thank you!
User C: Who was the first president of the United States?
User B: George Washington
User C: Thank you!
User A: What?!?!

对于只能看到 User BUser CUser C 用户,它可能会显示如下:

User B: 4
User C: Who was the first president of the United States?
User B: George Washington
User C: Thank you!

看起来这个问题可能会很快失控。尽管如此,我认为我的最初建议仍然是最好的,但我认为所有建议都会面临挑战。祝好运!


这意味着我必须将其设置为距离起点的静态距离。假设我将所有聊天室分成1英里x 1英里的网格。USER_A距离USER_B有2个街区的距离,他们可能在同一个聊天室中,也可能不在(取决于网格)。我更喜欢相对于用户位置的方式。而且,我对1英里x 1英里的静态房间也不太感兴趣。如果我要更改可见房间的半径,我就必须创建一整套新的房间。这会变得太混乱,也不具有可扩展性。也许可以在单个房间中广播消息,并且在1英里半径内的所有人都会收到它? - Bhavik P.
关于我的应用程序的更多信息:我只是想创建一个应用程序,让用户在一定半径范围内与其他(活跃)用户匿名聊天。是的,他们必须是活跃的才能看到对话。如果A看到B,那么B也会看到A。我考虑使用一个大型聊天室,并在每条消息上放置一个lat / lng。在获取消息时,仅检索在某个半径范围内的消息? - Bhavik P.
我更新了,希望这些更新能够更好地解释挑战。看起来很酷的挑战。祝你好运! - Luke Schlangen
我实际上从未考虑过这个。你是对的,它可能会失控。我最好还是做一个网格。 - Bhavik P.
太好了!我是否还需要提供更多的解释来使答案更完整? - Luke Schlangen

2
我会这样做:
概念上,聊天室是用户列表。
当用户登录时,您可以为每个用户计算一个“聊天室”。正如@Luke所指出的那样,您将返回一些地理半径和最小/最大用户数量的边界。
这些所谓的聊天室(实际上是附近用户的列表)可以基于某些用户签名(IP +用户代理)进行缓存。
有一些复杂性和重叠的房间,但您可以通过在新用户到达时根据在线用户重新计算来处理每个登录。
您可以限制计算,即获取300半径内的用户,然后在100半径内计算接近度。
另一种方法:您可以构建用户的Voronoi图,并为给定用户呈现相邻区域作为聊天邻居。
参考资料:https://en.wikipedia.org/wiki/Voronoi_diagram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接