node.js - 关于如何为聊天应用设计良好架构的建议?
问题描述
您好,我将实现一个社交聊天应用程序,以满足一些要求,但我不知道如何实现这一点。
必需的:
应用程序“前端”应该用 React Native 编写
支持端到端加密
支持用户对用户聊天
OAuth2.0
推送通知
历史
Django 或 Node 后端
问题出在后端设计上。我正在考虑使用带有 websockets 的 Node.js 或带有通道的 Django,但我不知道哪个是存储聊天(如电报)的好数据库设计,也不知道如何构建消息队列。
谁能给我一些关于聊天应用程序设计的提示?谢谢
解决方案
这是我的建议
您实际上有 3 个选择:
- 从头开始构建所有内容(正如您在最初的问题中所写的那样)。
实际上,在这里你会使用 Node.js Websockets、Django Channels 还是 Rails Action Cable 并不重要。它们将具有几乎相同的性能(或者 Node.js 可能会更好一点)。您也可以为此使用任何数据库:MySQL、PostgreSQL 或 MongoDB。
例如,您可以拥有这些数据库表结构:
对话
- ID
- created_at
- 更新时间
- 类型
- 姓名
- 描述
- 头像
- 参与者ID
- last_message_id
- owner_id
- unread_messages_count
留言
- ID
- created_at
- 更新时间
- 对话ID
- 文本
- 发件人ID
- 收件人 ID
- 附件 ID
- read_ids
- 交付的_ids
用户
- ID
- created_at
- 更新时间
- 登录
- 全名
- 头像
附件
- ID
- created_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 账户上)。所以强烈推荐。
因此,在您的情况下,类似的事情是可能的。
推荐阅读
- python-3.x - 字典python 3中值的括号
- ruby - 如何仅使用 Ruby 中字符串的前 5 个字符对数组进行排序?
- css - 如何使用 bootsrap 将对象与灯箱居中?
- java - 将注释存储在地图中,稍后查找
- certificate - 双向 TLS 身份验证:验证客户端证书
- go - Exercise: Web Crawler - print not working
- ssl - SSL_connect:SSLv3 读取服务器 hello A 中的错误
- ruby-on-rails - 失败的 gem 安装:gem 需要 ruby-2.6.1 但当前的 ruby-2.6.1
- networking - 具有相同压缩和解压缩时间的数据压缩算法?
- xml - 如何修复“无法使用文本输入编辑文本更改 android 提示颜色”