首页 > 其他分享 >面试场景题系列:设计聊天系统

面试场景题系列:设计聊天系统

时间:2025-01-04 17:30:53浏览次数:3  
标签:场景 HTTP 轮询 接收者 面试 聊天 服务器 客户端

1.场景需求界定

在本章中,我们探讨聊天系统(应用)的设计。几乎所有人都用过聊天应用。图-1展示了市面上一些最流行的聊天应用。

图-1

不同人可能想要不同的聊天应用。弄清楚准确的需求是非常重要的。举个例子,如果面试官想要的是一对一聊天系统,你就不要考虑如何设计一个主要用于群聊的系统了。

在本章中,我们会专注于设计一个像Facebook Messenger那样的聊天应用,它主要提供以下功能:

•一对一聊天,消息的传输延时低。

•小型群组聊天(最多100人)。

•展示在线状态。

•支持多设备,即同一个账号可以同时在多个设备上登录。

•推送通知。

我们设计的这个聊天应用可支持5000万DAU。

2. 顶层设计

为了设计出高水平的应用,你应该掌握关于客户端和服务器通信的基本知识。在聊天系统中,客户端可以是移动应用或网页应用。客户端之间不直接通信。每个客户端会连接到一个聊天服务。我们先关注基本操作。聊天服务必须支持下面的功能:

•接收来自其他客户端的消息。

•为每条消息找到正确的接收者并将消息发过去。

•如果接收者不在线,则在服务器上先暂时保存这个消息,直到该接收者上线。

图-2展示了客户端(发送者和接收者)和聊天服务之间的关系。

图-2

当一个客户端想要开始一个对话时,它会使用一种或者多种网络协议连接到聊天服务。对于聊天服务来说,网络协议的选择是很重要的,最好和面试官一起讨论一下这个问题。

对于大部分客户端/服务器应用来说,请求是先从客户端发起的。聊天应用的发送者端也是如此。在图-2中,当发送者通过聊天服务发送一条消息给接收者时,它使用的是经过时间验证的HTTP协议。HTTP协议是最常见的网络协议。在这个场景下,客户端打开了一个到聊天服务的HTTP连接并发送消息,聊天服务把消息发给接收者。保持请求头是一种高效的方式,因为它使客户端和聊天服务之间保持持久的连接,同时也减少了TCP握手的次数。在发送者端,HTTP协议也是一个不错的选择,很多流行的聊天应用如Facebook Messenger一开始都是使用HTTP协议来发送消息的。

然而,接收者端要复杂一些。因为HTTP请求是客户端发起的,从服务器端发送消息并不容易。近年来,很多技术被用于模拟服务器发起连接,包括轮询(Polling)、长轮询(Long Polling)和WebSocket。这些重要的技术在系统设计面试中经常被问到,下面我们分别介绍它们。

2.1 轮询

如图12-3所示,轮询是一种客户端周期性询问服务器是否有新消息的技术。轮询的开销可能很大,这取决于轮询的频率。它可能会耗费宝贵的服务器资源来回答一个在大部分时间中答案都是“没有新消息”的问题。

图-3

2.2 长轮询

轮询的效率较低,长轮询有时是更好的选择(见图-4)。

图-4

在长轮询中,客户端保持连接处于打开状态,直到有新消息可用或者达到超时阈值。一旦客户端收到新消息,它就会立刻将另一个请求发送给服务器,重新开始这个流程。不过,长轮询有一些缺点。

•发送者和接收者可能并没有连接到同一个聊天服务器。基于HTTP协议的服务器通常是无状态的。如果使用Round Robin的方式来做负载均衡,接收到消息的服务器可能并没有与等待接收消息的客户端保持长轮询连接。•服务器没有好的方法来判断客户端有没有断开连接。

•效率不高。如果一个用户并不经常聊天,长轮询依然会在超时之后周期性地建立连接。

标签:场景,HTTP,轮询,接收者,面试,聊天,服务器,客户端
From: https://blog.csdn.net/launch2020/article/details/144926040

相关文章

  • 【工业行业】10种常用的工业通信协议特点及应用场景
    一、modbus通讯协议特点:开放标准,不依赖于特定制造商可以使用RS232、RS485或TCP/IP。简单,易容实现应用场景:广泛用于各种工业应用,如PLC、传感器、执行器等二、PROFIbus通讯协议特点:基于循环的通信,提供分层的通讯模型,支持诊断和网络配置功能应用场景:广泛用于工厂自动化、过程控......
  • 2025年 Java 面试八股文(20w字)
    第一章-Java基础篇1、你是怎样理解OOP面向对象   难度系数:⭐面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征:继承:继承是从已有类得到继承信息创建新类的过程封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口多态性:多态性是指允......
  • Java中高级面试题部分答案解析
    List和Set比较,各自的子类比较对比一:Arraylist与LinkedList的比较1.rrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。2、因为地址连续,ArrayList要移动数据,所以插入和删除操作效率比较低。3、LinkedList基于......
  • Java面试题经典面试题220道(附答案)
    1.线程的生命周期?线程有几种状态?线程通常有五种状态,创建,就绪,运⾏、阻塞和死亡状态:        1. 新建状态(New) :新创建了一个线程对象。        2. 就绪状态(Runnable) :线程对象创建后,其他线程调⽤了该对象的start⽅法。该状态的线程位于可运⾏线程池中,变得可......
  • Spring AOP 面试题大全
    以下是SpringAOP(Aspect-OrientedProgramming,面向切面编程)面试中常见的15+道经典问题,每道问题都包含详细解答和代码示例,以便于理解与记忆。1.什么是AOP?问题:请解释什么是AOP以及其核心概念。解答:AOP是一种编程思想,用于处理程序中的横切关注点(如日志、事......
  • 高频 Python 面试题解析(附代码解释)
    高频Python面试题解析(附代码解释)引言Python作为目前最受欢迎的编程语言之一,广泛应用于Web开发、数据分析、人工智能等领域。在面试中,Python的基础知识、数据结构、算法等方面的高频问题总是被考察。因此,在这篇文章中,我们将深入剖析一些常见的Python面试题,帮助你轻松应对面试挑......
  • 程序员校招生面试宝典【二十一】
    面试技巧:反馈接收——如何优雅地接受批评并改进在求职面试过程中,反馈接收是一项至关重要的技能。无论你是初出茅庐的毕业生还是经验丰富的专业人士,学会有效地接收和利用反馈,可以极大地提升你的职业发展轨迹。这篇文章将探讨如何优雅地接受批评,并将其转化为自我提升的动力。......
  • 程序员校招生面试宝典【二十】
    技术讲解:让非技术人员也能理解的技术引言在技术面试中,能够清晰且通俗易懂地描述自己的项目经历是非常重要的。这不仅展示了你的技术能力,也体现了你对项目的理解以及你与团队协作的能力。面对由技术人员和非技术人员(如人力资源专家)组成的面试官团队时,确保所有成员都能理解......
  • JavaScript 中最难理解的三个知识点,面试命中率 99% !
    原型与原型链说到原型,就不得不提一下构造函数,首先我们看下面一个简单的例子:functionDog(name,age){this.name=name;this.age=age;}letdog1=newDog("哈士奇",3);letdog2=newDog("泰迪",2);首先创造空的对象,再让this指向这个对象,通过this.n......
  • 【从零开始入门unity游戏开发之——unity篇04】unity6基础入门——场景窗口(Scene)和层
    文章目录场景窗口(Scene)和层级窗口(Hierarchy)一、层级窗口(`Hierarchy`)1、添加新的对象(物体)2、`Hierarchy`层级窗口快捷键3、搜索二、Scene场景窗口1、工具栏控制台2、操作物体位置角度和缩放工具栏(1)平移(2)移动(3)旋转(4)缩放(5)矩形工具(6)综合(7)编辑碰撞体积3、窗口上方工具条内......