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

目录

  • 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.mzph.cn/news/664740.shtml

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

相关文章

99 C++内存高级话题。new/delete的进一步认识 整理

1. new 初始化的整理。 class Teacher120 { public:Teacher120() {cout << "teacher120 moren 构造函数" << endl;}Teacher120(int age):m_age(m_age) {cout << "teacher120 构造函数" << endl;}~Teacher120() {cout << &qu…

科普类—— 双目视觉系统在无人驾驶汽车中的安装位置(四)

科普类—— 双目视觉系统在无人驾驶汽车中的安装位置&#xff08;四&#xff09; 在无人驾驶汽车中&#xff0c;双目视觉系统的安装位置和两个相机之间的安装间距&#xff08;基线&#xff09;对于系统的性能至关重要。这些参数的选择需要基于工程数据和实际应用需求来确定。以…

【搜索术】代码阅读理解学习笔记

学习资料 《理解源代码》 1 静态阅读 1.1 目标结构 常见目录名含义docs项目文档examples示例代码

服务器托管的作用是什么?

服务器托管是将企业的服务器和相关设备托管到具有完善机房设施、高品质网络环境与运营经验的网络数据中心内&#xff0c;服务器托管在维护方面一般是由客户负责的&#xff0c;或者是由其他的授权人进行远程维护。 那服务器托管的作用都有哪些呢&#xff1f; 服务器托管不需要企…

数组练习题

知识点 数组 题目1 请创建一个长度为6的整数数组&#xff0c;并为数组中的元素赋值。遍历数组&#xff0c;打印所有元素&#xff0c;元素之间用空格隔开。比如&#xff1a; 数组为&#xff1a;{1,2,3,4,5} 打印结果&#xff1a;1 2 3 4 5 训练提示 1、数组中的元素有索引…

hivesql的基础知识点

目录 一、各数据类型的基础知识点 1.1 数值类型 整数 小数 float double(常用) decimal(针对高精度) 1.2 日期类型 date datetime timestamp time year 1.3 字符串类型 char varchar / varchar2 blob /text tinyblob / tinytext mediumblob / mediumtext lon…

CentOS7虚拟机设置静态IP

虚拟机上ip是有时效性的&#xff0c;过期后会自动更换&#xff0c;因此如果想让ip不变&#xff0c;就得手动设置静态ip。 第一步&#xff1a;先查看主机的子网掩码 1.1、windows命令ipconfig&#xff0c;如下图&#xff1a; 第二步&#xff1a;查看虚拟机的网关、ip区间的设…

单臂路由实验(华为)

思科设备参考&#xff1a; 单臂路由实验&#xff08;思科&#xff09; 一&#xff0c;实验目的 在路由器的一个接口上通过配置子接口的方式&#xff0c;实现相互隔离的不同vlan之间互通。 ​ 二&#xff0c;设备配置 Switch1 <Huawei>sys [Huawei]vlan batch 10 20…

nuxt.js中使用axios以及二次封装

nuxtjs中使用axios 有两种方法&#xff1a; 1. 普通的方式&#xff1a; 1.1&#xff1a; npm或者yarn安装依赖包 npm install axios -S 普通使用方式网上查询&#xff0c;这里不再过多叙述。 2. 集成的方式&#xff1a; 2.1:首先安装 nuxtjs/axios npm install nuxtjs/axi…

备考蓝桥杯每日一题——C++分支结构“ABC”

今天在洛谷上遇到了一道很有意思的题 题目&#xff1a; 【题目描述】 三个整数分别为 A,B,C。这三个数字不会按照这样的顺序给你&#xff0c;但它们始终满足条件&#xff1a;A<B<C。为了看起来更加简洁明了&#xff0c;我们希望你可以按照给定的顺序重新排列它们。 【输入…

【C++】类与对象(三)—运算符重载|const成员函数|取地址及const取地址操作符重载

前言 运算符重载&#xff0c;自增自减运算符重载&#xff0c;const成员函数&#xff0c;取地址及const取地址操作符重载 文章目录 一、运算符重载自增和自减运算符重载 二、const 成员函数三、取地址及const取地址操作符重载&#xff08;了解即可&#xff09; 一、运算符重载 运…

网络开发的隐形壁垒:如何巧妙解决跨域难题?

什么是跨域 跨域是浏览器受同源&#xff08;协议、域名、端口&#xff09;策略的限制&#xff0c;不允许不同源的站点之间进行某些操作&#xff08;如发送ajax请求&#xff0c;操作dom&#xff0c;读取cookie&#xff09;&#xff0c;如果不进行特殊配置是不能操作成功的&…

Linux中多路IO复用

首先要明白为什么要使用 多路IO复用 单进程/单线程要处理多个阻塞事件的时候会面临抉择&#xff0c;设置阻塞还是非阻塞呢&#xff1f;阻塞的话消息可能得不到及时的处理&#xff0c;就像排队买饭前边的饭卡丢了一堆人等他找饭卡&#xff0c;找到后才能接着打饭&#xff0c;非…

【MySQL】深入理解隔离性

深入理解隔离性 一、数据库并发的场景二、多版本并发控制&#xff08; MVCC &#xff09;三、三个前提知识1、3个记录隐藏字段2、undo日志 四、快照的概念五、Read View六、隔离级别RR与RC的本质区别 一、数据库并发的场景 数据库并发的场景总共有三种&#xff1a; 读-读&…

JVM中一次完整的GC回收流程

JVM堆内存结构简述 JVM堆内存结构图 堆初体验 所有的对象实例以及数组都要在堆上分配&#xff0c;堆是垃圾收集器管理的主要区域&#xff0c;也被称为“GC 堆”&#xff0c;也是我们优化最多考虑的地方。因为在一个项目中&#xff0c;会不断地创建对象&#xff0c;都是在堆里…

DevOps 教程 (4) - CI/CD 整合

在本第四章的"DevOps 教程"系列中&#xff0c;我们将介绍CI/CD整合的概念和实践。我们会介绍DevOps所带来的好处&#xff0c;包括团队协作、开发效率和产品交付速度的显著提升。 我们还将讨论在DevOps中的不同角色&#xff0c;并理解每个角色在持续集成和持续交付中的…

微调实操一: 增量预训练(Pretraining)

1、前言 《微调入门篇:大模型微调的理论学习》我们对大模型微调理论有了基本了解,这篇结合我们现实中常见的场景,进行大模型微调实操部分的了解和学习,之前我有写过类似的文章《实践篇:大模型微调增量预训练实践(二)》利用的MedicalGPT的源码在colab进行操作, 由于MedicalGPT代…

RAG +milvus示例

GitHub - NVIDIA/DeepLearningExamples: State-of-the-Art Deep Learning scripts organized by models - easy to train and deploy with reproducible accuracy and performance on enterprise-grade infrastructure. Towhee GitHub Zilliz GitHub

【交流】IGBT及驱动电路

最近要设计一款IGBT的驱动IC&#xff0c;学习了大部分的驱动电路。偶有心得&#xff0c;总结如下&#xff1a; 1、IGBT工作于大电流大电压的状态&#xff0c;这就要求其开关特性要好。尽量让IGBT工作在这种状态&#xff0c;I*V最小。换句话说&#xff0c;当有大电流时&#xf…

【LeetCode】216. 组合总和 III(中等)——代码随想录算法训练营Day25

题目链接&#xff1a;216. 组合总和 III 题目描述 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回…