【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.mfbz.cn/a/366246.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity学习之Unity核心(一)2D相关

文章目录 1. 前言2 图片导入概述3 图片设置的六大部分3.1 纹理类型3.1.1 Default3.1.2 Normal Map 法线贴图格式3.1.3 Editor GUI and Legacy GUI3.1.4 Sprite3.1.5 Cursor 自定义光标3.1.6 Cookie 光源剪影格式3.1.7 LightMap光照贴图格式3.1.8 Single Channel 纹理只需要单通…

【新书推荐】5.1节 16位汇编语言学习环境

第五章 16位汇编学习环境 16位汇编语言的学习环境是建立在8086计算机的基础上的,我将借助于DosBox虚拟机来实现16位汇编语言学习环境的搭建。 5.1节 16位汇编语言学习环境 本节内容:16位汇编学习环境的搭建。 ■汇编语言程序设计编程调试过程&#xff1…

Vulnhub billu b0x

0x01 环境搭建 1. 从官方下载靶机环境,解压到本地,双击OVF文件直接导入到vmware虚拟机里面。2. 将虚拟机的网络适配器调成NAT模式,然后开机即可进行操作了。 0x02 主机发现 nmap -sn 192.168.2.0/24 成功获取靶机IP为192.168.2.129。 0x0…

sqli.labs靶场(23关到28a关)

23、第二十三关 id1单引号闭合 找位置1 and 12 union select 1,2,3 爆库:1 and 12 union select 1,2,database() 爆表名:1 and 12 union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasecurity 爆字段&#…

【大数据】Flink SQL 语法篇(二):WITH、SELECT WHERE、SELECT DISTINCT

Flink SQL 语法篇(二) 1.WITH 子句2.SELECT & WHERE 子句3.SELECT DISTINCT 子句 1.WITH 子句 应用场景(支持 Batch / Streaming):With 语句和离线 Hive SQL With 语句一样的,语法糖 1,使用…

谷歌seo搜索引擎优化需要做什么?

当你要做谷歌seo,经手一个你之前没有接触过的网站,你首先要做的就是分析网站当前的流量数据,如果是新站自然不需要这一步,不过数据分析依旧是件很重要的事情,做seo不懂得分析数据相当于白做 再来就是你要了解网站所在的…

卸载Ubuntu双系统

卸载Ubuntu双系统 我们卸载Ubuntu双系统,可能出于以下原因: 1、Ubuntu系统内核损坏无法正常进入 2、Ubuntu系统分配空间不足,直接扩区较为复杂 3、以后不再使用Ubuntu,清理留出空间 123无论出于哪种原因,我们都是要…

柔性电流探头方向判断有哪些方法?干货分享!

柔性电流探头方向判断的方法干货分享!从理论到实践,助您成为专业人士!干货收藏,快看起来吧!      柔性电流探头方向判断一直是电力行业测试中的关键问题之一,确切地判断电流方向对于测试电力系统的稳定…

【GitHub项目推荐--一个由OpenAI提供支持的聊天机器人和虚拟助手的构建平台】【转载】

Botpress Botpress是一个开源项目,它提供了一个平台,用于构建、部署和管理基于人工智能的聊天机器人和虚拟助手 github地址: https://github.com/botpress/botpress Botpress的介绍 Botpress是一个开源项目,它提供了一个平台&…

ROS2 Humble学习笔记 (2)

本文发表于个人的github pages。因csdn本身显示插件和转载过程中导致显示不太友好。建议大家阅读原文。想查看完整内容,请移步到ROS2 Humble学习笔记2。 本文篇幅较长,可抽空按照章节阅读。本文只作为对入门教程的一种浮现和提升。 一、前言 在上一篇…

Spring框架——主流框架

文章目录 Spring(轻量级容器框架)Spring 学习的核心内容-一图胜千言IOC 控制反转 的开发模式Spring快速入门Spring容器剖析手动开发- 简单的 Spring 基于 XML 配置的程序课堂练习 Spring 管理 Bean-IOCSpring 配置/管理 bean 介绍Bean 管理包括两方面: Bean 配置方式基于 xml 文…

2023年上-未来几年我要做什么

1月份,离职。 2月份,春节休假回来,中旬去参加了一个月的瑜伽培训,学会了倒立、鹤蝉。。。。 3月份,瑜伽培训结束,开始收拾房子,并调研各类项目。 4月份,参与了朋友的区块链项目 …

echarts step line

https://ppchart.com/#/ <template><div class"c-box" ref"jsEchart"></div> </template><script> import * as $echarts from echarts // 事件处理函数 export default {props: {// 需要传递的数据data: {type: Array,defa…

Day06-Linux下目录命令讲解及重要文件讲解

Day06-Linux下目录命令讲解及重要文件讲解 1. Linux目录文件1.1 Linux系统目录结构介绍1.1.1 Linux与Windows目录结构对比 1.2 重要的Linux配置文件介绍1.2.1 /etc系统初始化及设置相关重要文件1.2.2 /usr目录的重要知识介绍------应用程序目录1.2.3 /var目录下的路径知识-----…

thinkphp项目之composer快速安装使用

引言 由于项目的需求&#xff0c;thinkphp项目使用到composer。网上搜索有一堆的教程使用&#xff0c;根据自己的需要摸索了下。 步骤 1. 安装phpstudy v8&#xff0c;这个经常用的运行环境&#xff0c;方便好多开发者。安装教程一步一步到最后就行。 2. 安装composer组件&a…

Github 2F2【解决】经验帖-PPHub登入

最近在做项目时,Github总是出问题,这是一经验贴 Github 2F2登入问题【无法登入】PPhub 2F2是为了安全,更好的生态 启用 2FA 二十八 (28) 天后,要在使用 GitHub.com 时 2FA 检查 物理安全密钥、Windows Hello 或面容 ID/触控 ID、SMS、GitHub Mobile 都可以作为 2F2 的工…

CTF特训(二):青少年CTF-MISC部分WP

FLAG&#xff1a;当觉得自己很菜的时候&#xff0c;就静下心来学习 专研方向:MISC&#xff0c;CTF 每日emo&#xff1a;听一千遍反方向的钟&#xff0c;我们能回到过去吗&#xff1f; CTF特训(二)&#xff1a;青少年CTF-MISC部分WP&#xff1a; 文章目录 CTF特训(二)&#xff1…

LeetCode:283. 移动零

283. 移动零 1&#xff09;题目2&#xff09;代码方法一&#xff1a;两层for循环方法二&#xff1a;使用双指针 3&#xff09;结果方法一结果方法二结果 1&#xff09;题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的…

计算机毕业设计 | SpringBoot 房屋租赁网 房屋租赁平台(附源码)

1&#xff0c;绪论 1.1 背景调研 在房地产行业持续火热的当今环境下&#xff0c;房地产行业和互联网行业协同发展&#xff0c;互相促进融合已经成为一种趋势和潮流。本项目实现了在线房产平台的功能&#xff0c;多种技术的灵活运用使得项目具备很好的用户体验感。 这个项目的…

day24打卡

day24打卡 思路&#xff1a;画出决策树&#xff0c;暴力枚举。子集问题 决策树&#xff1a; 函数头&#xff1a;void dfs(int n, int k, int pos) 函数体&#xff1a; ​ 出口&#xff1a;全局变量count k 保存结果到全局变量ret中 ​ 子问题&#xff1a;从pos位置向后变…