【IM】长连接网关设计探索(一)

news2024/11/15 18:57:28

目录

  • 1.长连接网关的必要性
  • 2. 设计目标
    • 2.1 技术挑战
    • 2.2 技术目标
  • 3. 方案选型
    • 3.1 网关IP地址的选择
      • 3.1.1 使用httpDNS服务
      • 3.1.2 自建http server作为IP config server
      • 3.1.3 最佳方案
    • 3.2 高并发收发设计
      • 3.2.1 C10K问题
      • 3.2.2 方案探索
        • 双协程监听channel实现全双工 + 一个定时器

1.长连接网关的必要性

在之前讲解关于消息可用性时,我们讲解过推拉结合(push & pull),而长连接网关的出现就是为了实现push模式,即主动及时地将消息发送到客户端,当然,收发平凡的业务场景也是我们选择长连接的原因之一。

2. 设计目标

2.1 技术挑战

  1. 客户端如何选择网关IP进行连接
  2. 网关服务器如何设计才能获取最大的并发力度,保证消息的低延迟,高吞吐?
  3. 作为一个有状态服务,服务端需要维护哪些状态,并尽可能减少状态维护占用内存量
  4. 业务层如何感知自身连接到哪一台网关,并进行消息下行分发,如何减少消息扇出?
  5. 某些场景下,客户端断开,如何进行快速重连,减少对用户体验的影响
  6. 如何实现对于网关的过载保护?
  7. 将网关服务中台化,适应多种业务场景的接入
  8. 多数据中心部署

2.2 技术目标


3. 方案选型

3.1 网关IP地址的选择

3.1.1 使用httpDNS服务

HTTPDNS(HTTP-based DNS)是一种基于HTTP协议的域名解析服务,它允许客户端通过HTTP请求获取域名对应的IP地址。传统的DNS解析通常是基于UDP协议的,而HTTPDNS则是通过HTTP协议来获取域名解析结果,具有更灵活的部署和使用方式。

下面是HTTPDNS的一般工作流程:

  1. 客户端发送HTTP请求到HTTPDNS服务器,请求包含需要解析的域名。
  2. HTTPDNS服务器接收到请求后,解析域名并返回对应的IP地址给客户端。
  3. 客户端收到IP地址后,将其用于访问目标服务器

使用httpDNS的优点有很多,包括根据网络状态和距离动态返回IP地址,负载均衡等,对于我们来说,最重要的是其安全性,可以防止DNS劫持:

  • DNS劫持
    DNS劫持是一种网络攻击,通过篡改DNS(Domain Name System)解析结果,将合法的域名解析到错误的IP地址上,从而将用户的请求重定向到恶意网站或者错误的服务器上。这种攻击可以在用户不知情的情况下进行,对网络安全构成潜在威胁。

    DNS劫持的实施方式通常有以下几种:

    • 本地Hosts文件劫持: 攻击者可以修改用户计算机上的Hosts文件,将某些合法域名解析到恶意的IP地址上。当用户访问这些域名时,计算机会优先使用Hosts文件中的解析结果,从而将用户重定向到攻击者控制的网站。

    • 路由器劫持: 攻击者可以篡改路由器的DNS设置,将合法域名解析到错误的IP地址上。当用户连接到这个被篡改的路由器时,所有通过该路由器进行的DNS解析都会受到影响,导致用户访问的网站被重定向到恶意站点。

    • DNS服务器劫持: 攻击者可以攻击DNS服务器,篡改其解析结果,将合法域名解析到错误的IP地址上。当用户使用受影响的DNS服务器进行域名解析时,会收到错误的解析结果,从而被重定向到攻击者控制的网站。

    DNS劫持可能会导致以下问题:

    • 用户访问到恶意网站,泄露个人信息或遭受其他安全威胁。
    • 用户被导向到错误的服务器上,导致网络访问速度变慢或者服务不稳定。
    • 网站的流量被劫持到恶意网站上,造成业务损失或者名誉受损。
  • HTTPDNS防御DNS劫持机制

    HTTPDNS主要通过将DNS解析的过程移至HTTP协议下来防范DNS劫持。

    它的基本原理是将域名解析请求发送到HTTP服务器,由服务器返回域名对应的IP地址。相比传统的DNS解析,HTTPDNS的主要优势在于可以避免受到DNS劫持的影响,提高解析的准确性和可靠性。

    HTTPDNS防范DNS劫持的方法主要包括以下几点:

    1. HTTPS加密通信: HTTPDNS通常采用HTTPS协议与HTTPDNS服务器进行通信,确保通信过程中的数据传输安全和完整性,防止数据被篡改或窃取。

    2. 服务器认证: HTTPDNS服务器可以使用SSL证书进行身份认证,客户端在与服务器建立连接时验证证书的有效性,确保连接到的是合法的HTTPDNS服务器,防止中间人攻击。

    3. 多地域多IP解析: HTTPDNS通常会返回多个地域的IP地址,并且这些IP地址会根据网络环境的不同进行动态调整和优化。即使某个地域的IP地址受到了劫持,仍然可以通过其他地域的IP地址来提供正常的解析服务。

    4. 实时监控和切换: HTTPDNS服务商会对服务器的IP地址进行实时监控,一旦发现IP地址受到劫持或异常,会立即切换到备用IP地址,保证服务的可用性和稳定性。

    5. 缓存策略: HTTPDNS客户端通常会采用缓存策略,将解析结果缓存到本地,避免频繁地向服务器发送解析请求,降低网络延迟和提高解析速度。同时,客户端会定期更新缓存,获取最新的IP地址信息。


3.1.2 自建http server作为IP config server

  • 为什么需要自建IP CONFIG
    虽然HTTPDNS有一定的调度策略来帮助我们选择网关地址,但是毕竟其是一个通用的服务,不能只对我们的长连接场景来进行针对性的调度

自建http server一方面提供了更高的可靠性,同时可以基于业务场景做出智能调度策略。

3.1.3 最佳方案

我们将HTTPDNS与自建http server 同时使用,HTTPDNS保障localDNS劫持问题,自建http server保障有效的调度。

  • 业务流程
    在这里插入图片描述

3.2 高并发收发设计

3.2.1 C10K问题

在十多年前,互联网并不发达的时候,就有人提出了著名的C10K问题:

  • C10K问题指的是支持同时连接到服务器的客户端数量达到10,000个的挑战。在网络编程中,这是一个重要的问题,特别是对于服务器需要处理大量并发连接的场景,比如Web服务器、聊天服务器等。C10K问题的挑战主要来自于服务器需要同时处理大量的客户端连接请求,而传统的同步I/O模型无法有效地应对这种高并发的需求。在传统的同步I/O模型中,每个连接都需要一个独立的线程或进程来处理,当连接数量很大时,会消耗大量的系统资源,导致性能下降甚至系统崩溃

显然,在如今的互联网场景下,C10K已经不是所追求的目标,C100K,C1000K是更加现实的需求,但是,C10K问题的提出确实大大推进了服务器设计的发展进程。

3.2.2 方案探索

双协程监听channel实现全双工 + 一个定时器

在这里插入图片描述

  1. 一个线程监听accept
  2. 使用accept返回的连接socket创建连接,同时对这个sock穿件两个协程分别收发消息
  3. 当发现某个sock有数据到来,使用read channel将消息上报给线程池,分配线程进行处理
  4. 服务端设置飞行队列,存储回复消息,每发送一个消息时创建一个协程,建立一个定时器,并在等待client ack时阻塞

优点:

  • 实现简单 (以上实现可参考开源方案 goim)
  • go协程十分轻量,通过水平拓展可以达到百万连接

缺点:

  • 内存开销大,难以突破 C10M瓶颈
  • 协程多,协程调度开销大,延迟拉高
  • 一个协程4K内存,几万长连接下内存占用超64G机器极限,OOM风险高
  • 每个下行消息都需要1 goruntinue + 1 timer ,push场景下容易OOM

在下一篇文章中,我们将接续介绍更多的实现方案,以长连接所需要维护的信息有哪些

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1429588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

02-Java抽象工厂模式 ( Abstract Factory Pattern )

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂 该超级工厂又称为其他工厂的工厂 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类 每个生成的工厂都能按照工厂模式提供对象 …

移远(Quectel)物联网通信解决方案

一、方案简介 无线通信模块是具备无线通信的电路模块,它能通过无线连接传输数据,能识别分析主控制器发来的命令,控制节点设备的工作,或者向主控制器发送当前节点设备的工作状态。 市面上常用的无线通信模组包括蓝牙模组、WLAN模…

屏幕画笔工具--ZoomIt

现在有很多屏幕画笔工具,很多都需要占用屏幕一块面积,用于可视化相关功能,使用鼠标点击的方式操作。对于屏幕画笔工具,我最看重的是它的 无屏幕入侵性,终于找到了符合这个特点的屏幕画笔工具--ZoomIt。ZoomIt 是用于技…

分享一个好玩的虚拟数字人项目

最近在github上看到一个虚拟数字人的项目——VirtualWife:一个虚拟数字人项目,项目还处于孵化阶段,有很多需要优化的地方,作者想打造一个拥有自己“灵魂”的虚拟数字人,你可以像朋友一样和她相识,作者希望虚拟数字人融入人类生活,作为恋爱导师,心理咨询师,解决人类的情…

Ubuntu18.04安装Matlab流程笔记

提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 Ubuntu18.04 安装Matlab流程 下载安装包和破解文件安装Matlab注册并运行 下载安装包和破解文件 matlabR2019A源码 提取码:2ztb 下载的Linux matlab2018a文件夹内有三个文件: # 解压Matlab201…

Compose | UI组件(十二) | Lazy Layout - 列表

文章目录 前言LazyListScope作用域 用来干什么?LazyColumn组件含义?LazyColumn的基本使用LazyColumn Padding设置边距LazyColumn 设置边距 (contentPadding)LazyColumn 为每个子项设置边距 (Arrangement.spacedBy())LazyColumn 根据 rememberLazyListSta…

C++文件操作(2)

文件操作(2) 1.二进制模式读取文本文件2.使用二进制读写其他类型内容3.fstream类4.文件的随机存取文件指针的获取文件指针的移动 1.二进制模式读取文本文件 用二进制方式打开文本存储的文件时,也可以读取其中的内容,因为文本文件…

通过WSL2来实现Windows10/11的深度学习模型GPU加速,TensorFlow项,Jupyter及其插件安装,CQF心得,金融量化

通过WSL2来实现TF的GPU加速 为什么要用WSL(Windows Subsystem Linux)安装WSL2,miniconda,cuda,cudnn,TA-Lib安装 WSL2安装 Miniconda3安装 CUDA安装 cuDNN安装 TensorFlow 库安装 TA-Lib 库安装其它CQF及金…

MySQL-----DML基础操作

DML语句 DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增删改操作。 ▶ 添加数据(INSERT) 【语法】 1. 给指定字段添加数据 INSERTO 表名 (字段名1,字段名2,...) VALUES (值1,值2,...); 2.给全…

获取真实 IP 地址(二):绕过 CDN(附链接)

一、DNS历史解析记录 DNS 历史解析记录指的是一个域名在过去的某个时间点上的DNS解析信息记录。这些记录包含了该域名过去使用的IP地址、MX记录(邮件服务器)、CNAME记录(别名记录)等 DNS 信息。DNS 历史记录对于网络管理员、安全研…

跟着cherno手搓游戏引擎【19】抽象纹理

引入: 导入stb_image: GitHub - nothings/stb: stb single-file public domain libraries for C/C 下载复制stb_image.h的内容(8000多行),然后粘到如图位置 stb_image.cpp: #include"ytpch.h" #define STB_IMAGE_IM…

LabVIEW叶片厚度远程监控

LabVIEW叶片厚度远程监控 随着网络技术的高速发展,远程监控广泛应用在各个领域。本文介绍了一种基于LabVIEW的植物叶片厚度远程监控系统,旨在实现对植物生长状况的精准监测和分析。 该系统利用LabVIEW软件开发工具,通过TCP网络协议实现数据…

抖音协议算法

以下是一些可能存在于社交媒体平台算法中的常见组成部分: 1. 用户兴趣模型:平台会根据用户的行为、喜好、关注的话题等信息,构建用户的兴趣模型。这可以通过分析用户的观看历史、点赞、评论、分享等行为来实现。 2. 内容特征提取&#xff1…

node.js基础--01

Author nodes:(题记) node.js is an open-source,cross-platform JAVAScript runtime environment。 node.js是一个开源,跨平台的js运行环境 common commands(常用指令) 1、C: enter hard …

C语言第十七弹---指针(一)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 指针 1、内存和地址 1.1、内存 2、指针变量和地址 2.1、取地址操作符(&) 2.2、指针变量和解引用操作符(*)…

短剧小程序开发:打造高效、便捷的娱乐体验

随着移动互联网的普及和用户需求的多样化,短剧小程序作为一种新型的应用形态,逐渐受到了广大用户的青睐。短剧小程序开发旨在为用户提供一种高效、便捷的娱乐体验,让用户在忙碌的生活中轻松享受到精彩的短剧内容。本文将探讨短剧小程序开发的…

基于ssm的运动会管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

Java玩转《啊哈算法》解密QQ号之队列

行有不得,反求诸己 文章目录 开头代码地址引子案例分析代码 队列封装升级演示 开头 各位好!本人在看《啊哈算法》,写的确实不错。 但略微遗憾的是,书籍示例代码是c语言,不是本人常用的Java。 那就弥补遗憾&#xff…

Linux 系统开始配置

文章目录 备份源为root 设置密码安装基本工具切换root 用户删除snap从 Ubuntu 移除 Snap 后使用 deb 文件安装软件商店和 Firefox在 Ubuntu 系统恢复到 Snap 软件包总结 删除 vim安装neovim在线安装neovim压缩安装neovim安装lazyvim安装剪切板 安装qt配置 Qt 环境不在sudoers文…

Flutter 仿抖音 TikTok 上下滑动 播放视频

Flutter 仿抖音 TikTok 上下滑动 播放视频UI框架,视频播放使用 video_player github:GitHub - PangHaHa12138/TiktokVideo: Flutter 仿抖音 TikTok 上下滑动 播放视频UI框架 实现功能: 1.上下滑动自动播放切换视频,loading 封面…