在本章中,我们将讨论在线消息服务的系统设计。
WhatsApp与其他消息传递服务有何不同?
在WhatsApp中,文本是端对端加密的。因此,中间服务器无法读取您的消息。
在WhatsApp中,消息存储在服务器中,直到另一方读取消息为止。另一方阅读该消息后,该消息将从服务器中删除。
我们将在本章中讨论的功能是:
1.用户群
2.上次看到
3.发送图像或其他文档之类的媒体
4.加密
考虑到消息传递服务非常受欢迎,许多用户将使用此服务。因此,您需要水平扩展服务器。在水平扩展时,需要一个负载平衡器。
因此,消息将首先使负载均衡器发热,负载均衡器将检查消息将发送到的位置。
我们还需要DB保存消息。
7.1简单通讯如下
因此,假设用户UserA向UserB发送一条消息,一旦移动设备连接到Internet,该消息就会发送到负载均衡器,然后再发送到Message Server。
然后,消息服务器将检查其他用户(即UserB)是否已连接到该服务。如果已连接UserB,则消息将发送到UserB。如果UserB未连接到服务,则该消息将存储在DB中。
一旦UserB连接到服务器,服务器就会将该消息发送给UserB。
这是一条消息将端到端工作的方式。
7.2了解像上次看到的功能,单勾和双勾会起作用吗?
这些功能可以通过确认服务来完成。
7.2.1单笔交易
一旦来自UserA的消息到达服务器,服务器将发送一条确认消息,说明已收到该消息。然后,UserA将显示单个刻度。
7.2.2双击:
一旦来自服务器的消息通过适当的连接将该消息发送给UserB,则UserB将向服务器发送确认,表明它已接收到该消息。
然后,服务器将向UserA发送另一个确认,因此它将显示双击。
7.2.3蓝勾号:
一旦UserB打开whatsapp并检查了消息,UserB将向服务器发送另一个确认,告知用户已阅读该消息。然后服务器将发送另一个确认消息ti UserA。然后,用户A将显示蓝色勾号。
为了识别所有确认,所有消息都将附加唯一的ID。
7.3上次浏览的功能:
为此,我们需要一种心跳机制。当用户在线或使用应用程序时,此服务将每5秒钟发送一次心跳。
当服务器收到心跳信号时,它将存储在另一个表中,该表具有User_name和最后一次看到的时间。
然后,当UserB联机时检索此信息。
7.4消息服务器的工作
每当与服务器建立连接时,都会创建一个单独的线程以及一个用于存储消息的队列。然后将有一个单独的表,该表将threadID与DeviceID映射。
因此,当收到来自UserA的消息时,如果UserB已连接,则UserA的线程将检查该表。如果已连接UserB,则消息将发送到UserB队列。然后,UserB的线程将检查其队列中是否有任何消息。如果有任何消息,则这些消息将发送到UserB。
如果UserB未连接到服务,则表中没有UserB的条目。当UserA向UserB发送消息时,由于该条目不可用,消息将存储在DB中。 UserB联机后,该消息将被传递。
7.5了解媒体传输的工作原理?
对于发送媒体,我们不能使用以前创建的线程。由于线程重量较轻,因此在同一连接中发送媒体将效率不高。为此,您可以使用HTTP连接将媒体上载到http服务器。然后,该服务器将HashID返回给UserA。然后,我们将HashID以及媒体类型发送给UserB。
收到该消息给UserB后,UserB将从http服务器下载。此过程适用于所有媒体类型。
7.6对于加密,您可以使用
1.在两个客户端之间共享的一个密钥。
2.一个用户将拥有一个私钥,并与其他用户共享公钥。
该网站上可用的教程列表:
C编程20+章 | C ++编程80+章 |
100多个编码问题 | 数据结构和算法85+章 |
系统设计20+章 | Shell脚本编写12章 |
4g LTE 60+章节 | 最常见的编码问题 |
5G NR 50+章 | Linux系统编程20+章 |