关于如何为聊天应用设计良好架构的建议?

Posted

技术标签:

【中文标题】关于如何为聊天应用设计良好架构的建议?【英文标题】:Advice on how to design a good architecture for a chat app? 【发布时间】:2018-09-06 05:47:47 【问题描述】:

您好,我要实现一个社交聊天应用程序,以满足一些要求,但我不知道如何实现。

必填:

应用程序“前端”应使用 React Native 编写

支持端到端加密

支持用户间聊天

OAuth2.0

推送通知

历史

Django 或 Node 后端

问题在于后端设计。我正在考虑使用带有 websockets 的 Node.js 或带有通道的 Django,但我不知道哪个是存储聊天(如电报)的好数据库设计,也不知道如何构建消息队列。

谁能给我一些有关设计聊天应用程序的提示?谢谢

【问题讨论】:

【参考方案1】:

这是我的建议

你实际上有3个选择:

    从头开始构建所有内容(正如您在最初的问题中所写的那样)。

实际上,你使用 Node.js Websockets、Django Channels 还是 Rails Action Cable 并不重要。它们将具有几乎相同的性能(或者 Node.js 可能会更好一点)。您也可以为此使用任何数据库:mysql、PostgreSQL 或 MongoDB。

例如,你可以有这些数据库表结构:

对话

身份证 created_at updated_at 类型 姓名 说明 头像 participants_ids last_message_id owner_id unread_messages_count

消息

身份证 created_at updated_at conversation_id 文字 sender_id recipient_id attachments_ids read_ids delivered_ids

用户

身份证 created_at updated_at 登录 全名 头像

附件

身份证 created_at updated_at 类型 链接

然后,您的所有用户都将与您的服务器建立持久的 websocket 连接,并将使用它来发送/接收消息。您的服务器会将所有消息存储在数据库中的适当表中。

此外,您的服务器将提供 REST API 来检索对话、消息、附件和其他用户配置文件的列表。

我想说,这个选项适用于小负载、少量用户(因为选择的技术 (Node.js/Python/Ruby) 并且因为您将自己构建它,不确定您是否有足够的实际经验时间应用程序构建)

    使用一些开源聊天服务器,例如Ejabberd、Tigase、Openfire。他们实际上已经实现了所有实时聊天的东西,并且具有良好的高负载能力(人们花了 10 年的时间来构建它们)。您只需要将它们与您的应用服务器集成。

您的应用服务器可能会提供 REST API 来检索对话、消息、附件、其他用户个人资料的列表。

聊天服务器将提供一种连接、发送/接收消息的方式。您还需要为所选的聊天服务器编写一个插件,该插件将跟踪所有消息并将它们放入您的服务器应用程序数据库中。

    使用一些现成的云消息传递平台。在野外也有很多例子,例如Twillio、ConnectyCube、Layer等。

例如 - ConnectyCube - 具有消息功能、用户群、推送通知、视频通话、聊天机器人的消息和视频通话提供商。您可以将您的应用服务器与其 REST API 集成。甚至根本不编写自己的 App Server 并完全使用这个平台。因此节省了大量的时间和金钱。

使用此类平台,您无需关心服务器托管、服务器监控、服务器正常运行时间和其他与服务器相关的内容,您只需在您的应用中使用它们的 API 和 SDK。大多数此类平台提供免费计划以及您拥有数据的专用企业解决方案(例如,它部署在您自己的 AWS 账户上)。所以强烈推荐。

因此,在您的情况下,这样的事情是可能的。

【讨论】:

在阅读了您的建议后,我想我会选择 Ejabberd,因为它比我自己开发聊天更容易而且是免费的。所以我可能会管理用户身份验证、配置文件和元数据,...扔掉我的 Django 或 Node 服务器,让聊天功能到 Ejabberd 之一。现在我的问题是是否可以在我的服务器和 Ejabberd 之间创建一个“通道”来共享身份验证和用户数据。 @Antonio 你可以问一个单独的问题,我会在那里提供答案 我在这里发布了问题***.com/q/52224543/4202521【参考方案2】:

Here is a tutorial of AWS。它使用 Node 和 Redis 作为后端。

我按照教程构建了一个在线聊天应用程序,它满足了你的所有要求,除了第一个,因为我的应用程序只需要网络客户端。

顺便说一句,我使用 Redis 进行集群和 DynamoDB 保存所有消息,因为我不太确定 Amazon ElastiCache for Redis 的可靠性。在我的测试中,Redis 运行良好,并且在 3 个月内没有丢失任何消息,但我的同事坚持认为 Redis 不可靠(好吧,他们没有提供任何数据来证明这一点),因此我添加了 DynamoDB 以确保可靠性。

【讨论】:

redis 并非不可靠。

以上是关于关于如何为聊天应用设计良好架构的建议?的主要内容,如果未能解决你的问题,请参考以下文章

Android 聊天应用程序的最佳方法

关于如何为前端应用程序创建 webjar 的分步指南? [关闭]

如何为消费者应用程序设计“NOSQL”数据库(例如社交书签)[关闭]

我如何为我的应用程序创建这样的“关于”页面?如何在 UIView 下拥有 UITableView(分组)?

如何为传入和传出的聊天消息使用不同的布局

如何为我的 Elastic Beanstalk Java 应用程序启用 HTTPS?