千万级入口服务[Gateway]框架设计(三:分层模式)

本文将以技术调研模式编写,非技术同学可跳过。

文章目录

    • 背景
      • 分层
        • 分发+Handle
        • 分发+hook
        • 分发+并发分层
      • 管道
        • Channel
          • Demo 实现
      • 小结
    • 附录

背景

基于组件(插件)模式设计构建的入口服务实现中,使用 Go 原生包 plugin 的时候,会存在功能缺陷问题,不足以支撑预期能力;在使用 go-plugin 开源包的时候,虽然功能缺陷得到了弥补,但丧失了部分的性能(组件与主程序通信成本)。

详细见上文 千万级入口服务[Gateway]框架设计(一)

详细见上上文 千万级入口服务[Gateway]框架设计(一)

本文将介绍另一种基于 “分层” 、“管道” 的架构模式。

分层

分层的思路,从你开始学习计算机就见到了。计算机结构 ”冯诺伊曼“ 模型、数据库/Linux 内核结构,等等。可以说 “分层” 是对复杂性问题拆解,化繁为简的主要且有效的思路。

在这里插入图片描述

将业务逻辑进行上层抽象,分别划分为几层,层级之间上下级依赖。但需要注意的是,对于业务抽象控制粒度越细,实现成本也就会越大;并且如果业务的调用关系是动态的,抽象层多会导致整体复杂度上升,量级变重;后续业务通信无充分了解抽象分层结构的情况下,功能实现的质量存在不菲的成本,对后续服务的维护、扩展都增加了一层迷雾。

动态的调用关系:出现在复杂业务场景中,即下游的服务存在多个,实际的调用服务由上游服务的响应字段决定,整个路由呈现一种动态关系拓扑。

维护、扩展的迷雾:指由于未充分了解框架设计就进行迭代开发,无法保证交付的功能充分利用框架特征,使得产出质量存在不同程度值得揣测的地方。

下面从不同的划分粒度区分为三种方式。

分发+Handle

在现行的基础上进行粒度放大,故

  • 业务实现更自由。
  • 框架从业务中剥离,维护成本更低。

在这里插入图片描述在 Web 模式上,把现有流程切分为 router + execute 两部分。

  • router
    • 进行流量分发至对应的 handle。
  • execute
    • 不对具体业务处理再做框架层划分,具体设计、实现由业务开发同学实现。

分发+hook

在 handle 的基础上,增加 hook 约束,故

  • 约束粒度过小,对于无 hook 需求的场景下,复杂度过高。

在这里插入图片描述

在 Web 模式上,把现有流程切分为 router + afterhook\execute\beforehook\assert 的逻辑。

  • router

    • 进行流量分发至对应的 handle。
  • afterhook\execute\beforehook\assert

    • 在具体业务处理之间,控制粒度大小到,执行前置、执行、执行后置 。

分发+并发分层

需要对 当前业务梳理,重新划分子服务调用次序,分层并发调用,故

  • 存在下游子服务路由是动态变更的场景,无法提前预知并分层,需额外设计路由。
  • 可将大部分服务调用由串改并行,性能将有所提升。
  • 若存在动态路由问题,需要针对此问题做额外的处理,设计、实现的复杂度高。

使用前提是,存在静态子服务拓扑图,将服务调用关系进行动态染色划分为不同的层级,依据层级服务进行并发调用。

  • 抽象出 参数构造+响应拼接、服务并发调用 两部分。

管道

管道的思想,如果是传统语言见的可能较少,在 Goland、Ruby 等新式,尤其是语言层面支持并发、面向云原生的设计中比较常见,主打的是对性能的极致追求、高性能下的大数据、大模型 等对数据的流式处理。

注:云原生了解可前往:云原生应用架构的迁移 一 :增量迁移范式

在这里插入图片描述

不过不要紧,可以简单的先把中间件的概念移植到管道中来,进而再深入学习。这里基于 Goland 中的 Channel 进行设计。

注:Goland 了解可前往:Go 语言的设计反思

Channel

上述的几个方案和实现中,都是在请求内部的串改并,甚至是抛离了语言层面「在现有的PHP基础上操作即可」。

这里谈论一种基于管道的模式设计,实现服务层级的并行,特别适用于特大并发场景、符合 Go 语言特征。

在这里插入图片描述

主协程将负责各个自服务的监听、并发调用,业务协程只作为服务的发起和响应的接收。将不同的请求以子服务维度进行汇聚,并行调用。

这里做方案简单的概述:

  • 装配「只需编排服务参数」
    • 由线性流程设计转为流水式,高度装配化。
  • 提速
    • 对单次 pv 中的多个服务串行转换为并行进行。
    • 对单次 pv 调用转换为并发进行。
  • 扩展
    • 服务模块化,多路由调用100%可复用。
    • 框架力度较强,对业务屏蔽掉用环节,对基础调用功能实现要求高「功能完备、支持定制配置」。

但需要注意的是,

  • 涉及 Go Channel 模型,实现成本较高。
    • 需要严谨、科学的兜底、并发死锁等问题/方案的考量。
Demo 实现
package mainimport ("fmt""sync"
)type FInput struct{callback chan FInputparam stringres string
}func main () {fmt.Println("hello https://tool.lu/")c := make(chan FInput,3)defer close(c)var wg sync.WaitGroupwg.Add(3)  go F(c,wg) //服务开启监听go A(c,wg) //发起服务请求go B(c,wg) //发起服务请求wg.Wait()fmt.Println("X https://tool.lu/ is finish")
}func F (c chan FInput,wg sync.WaitGroup){fmt.Println("F https://tool.lu/ len:",len(c))for{i, ok := <-cfmt.Println("F https://tool.lu/ ok:",ok)fmt.Println("F https://tool.lu/ param:",i.param)if ok{i.res = i.param + " is executed "i.callback <- i}}fmt.Println("F https://tool.lu/ is finish")wg.Done()
}func A (c chan FInput,wg sync.WaitGroup){cb:=make(chan FInput)defer close(cb)var p FInputp.callback = cbp.param = "A"c<-pi, ok := <-cbif ok{fmt.Println("A https://tool.lu/ res ok:",ok)fmt.Println("A https://tool.lu/ res param:",i.param)fmt.Println("A https://tool.lu/ res value:",i.res)}fmt.Println("A https://tool.lu/ is finish")wg.Done()
}func B (c chan FInput,wg sync.WaitGroup){cb:=make(chan FInput)defer close(cb)var p FInputp.callback = cbp.param = "B"c<-pi, ok := <-cbif ok{fmt.Println("B https://tool.lu/ res ok:",ok)fmt.Println("B https://tool.lu/ res param:",i.param)fmt.Println("B https://tool.lu/ res value:",i.res)}fmt.Println("B https://tool.lu/ is finish")wg.Done()
}

小结

其实对比上述的各种架构模式设计,都是各具特色,优缺兼并。在进行架构选型的时候,想到不同的模式只是第一步。在此前提下,才能更进一步的挑选。

随着 chatGPT 进入大众的视野,”大模型航道“ 变得赤手可热,而且其独特的衍变进程更是一骑绝尘。毫不客气的说,未来的各种应用都将会是更智能、更大模型…

下一章讲介绍 “入口服务” 如何和 ”大模型“ 相结合,设计面向未来的架构模式,敬请期待!

附录

  • graphql-go
  • Linux 内核网络分层结构

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

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

相关文章

ChatGPT配合两款神器,1分钟生成流程图

流程图&#xff0c;工作上再正常不过的一种图形&#xff0c;常见制图方法对比&#xff1a; 传统手动制图&#xff1a;耗时耗力&#xff0c;迁移性差AI 辅助制图&#xff1a;使用自然语言提出需求&#xff0c;零基础快速制图 几款常见的我在用的在线绘图工具推荐&#xff1a; Pr…

面向对象实现游戏聊天中的敏感词屏蔽功能,将敏感词汇用星号***替换

import java.util.Scanner;//新建一个类 public class Replace {// 定义一个字符串String commons;// 建一个替换的方法public void replace() { //控制台输入Scanner sc new Scanner(System.in);// 提示输出&#xff08;为方便功能实现&#xff0c;此处提示内定的敏感词汇&am…

DreamGPT:让ChatGPT活在梦里!利用幻觉来激发创意灵感

本文来源 新智元 编辑&#xff1a;LRS 【新智元导读】语言模型幻觉从bug变feature&#xff01; ChatGPT最为人诟病的缺陷就是「胡编乱造」了&#xff0c;可以一本正经地讲一段林黛玉倒拔垂杨柳的故事。 对于真正想了解「林黛玉」或「倒拔垂杨柳」的人来说&#xff0c;这段回答…

这五个问题一下就看出阿里通义千问和ChatGPT的差距了

前言 阿里通义千问申请过了&#xff0c;为了看看达到了什么水平&#xff0c;于是我问题了5个ChatGPT回答过的问题1&#xff0c;这五个问题网上都是没有的&#xff0c;是我自己想出来的。 问题一:小明说今天他吃了一只公鸡蛋&#xff0c;请问小明诚实吗&#xff1f; ChatGPT 这…

chatgpt赋能python:Python模拟终端:打造简单易用的命令行工具

Python模拟终端&#xff1a;打造简单易用的命令行工具 在现代编程中&#xff0c;命令行工具被广泛使用。无论是开发、测试还是维护&#xff0c;都需要通过命令行工具完成。Python的灵活性和强大的库使得开发命令行工具变得更加容易。本文将介绍如何使用Python编写一个简单易用…

Llama 2高调开源颠覆大模型圈!2万亿token训练,打不过GPT3.5

​ 编辑 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 来源 | 新智源 ID | AI-era 一觉醒来&#xff0c;Meta直接丢了一颗重磅核弹&#xff1a;Llama 2&#xff01; 继LLaMA开源后&#xff0c;Meta今天联手微软高调开源Llama 2&#xff0c;一共有7B、…

对话哥伦比亚大学教授俞舟:人工智能公司的竞争,到最后还是产品和服务的竞争...

视学算法报道 编辑&#xff1a;杨德泽 在对谈中&#xff0c;俞舟不像其他创业者那样大谈 ChatGPT 对于行业的巨大影响力&#xff0c;她更加关注产品、更加关注使用产品的人&#xff0c;她不相信 AI 可以替代人类&#xff0c;而是帮助人类提升技能。 在俞舟开始她的对话系统创业…

昨晚,爆了。

昨天晚上&#xff0c;我们微信群爆炸了。 因为星球就聊挣钱&#xff0c;首期小红书电商训练营开放报名&#xff0c;第一期我们准备开放了100个名额。 结果&#xff0c;不到3分钟就爆满了100人&#xff0c;再我们赶紧结束报名的时候&#xff0c;又涌入了40人。 这是我们就聊挣钱…

马斯克在中国的44小时丨多少值得看

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 马斯克中国行的高度神秘性背后&#xff0c;预示特斯拉对于此次行程成果的看重和期待。 作者丨 魏帅 任娅斐 来源丨中国企业家杂…

chatgpt赋能python:Python图像拼接代码:将多张图片合并为一张

Python图像拼接代码&#xff1a;将多张图片合并为一张 如果您需要将多个图片合并成一张大图&#xff0c;那么Python图像拼接代码可以帮助您简化这个过程。这篇文章将为您介绍如何使用Python的Pillow库来合并多个图片&#xff0c;并且展示了一些关于图像拼接常见的问题和技巧。…

开源一个各种USB电缆的测试仪,再也不用担心被只有充电功能的数据线坑了

作者&#xff1a;晓宇&#xff0c;排版&#xff1a;晓宇 微信公众号&#xff1a;芯片之家&#xff08;ID&#xff1a;chiphome-dy&#xff09; 01 想知道你的USB Type C数据线是USB2或者USB3吗&#xff1f;大家是否有一些仅有充电功能的USB数据线在你的抽屉里&#xff0c;等待…

OpenAI再出新作,AIGC时代,3D建模师的饭碗危险了!

大家好,我是千与千寻,也可以叫我千寻哥,说起来,自从ChatGPT发布之后,我就开始焦虑,担心自己程序员的饭碗会不会哪天就被AIGC取代了。 有人说我是过度焦虑了,但是我总觉有点危机感肯定没有坏处。(结尾反转,hhh,希望你看下去!) 不过好家伙,还没等AIGC大模型完全替…

python编写照片中人脸标识并保存功能

这是我之前回答中的代码的更新版本&#xff0c;它检测图像中的人脸并将检测到的人脸保存为单独的图像&#xff1a; 需要安装opencv-python pip3 install opencv-python -i https://pypi.douban.com/sample/ 还需要训练模型&#xff08;人脸识别文件&#xff09;&#xff1a;…

【钓鱼实测】写bug给new bing和chatGPT查。问他们林黛玉倒拔垂杨柳

BUG 错误代码 #include <iostream> #include <vector> using namespace std; int main() {vector<int> vec{1,2,3,2,4};for (auto iter vec.begin(); iter ! vec.end(); iter ){if (*iter 2) {vec.erase(iter);}}cout << vec.size() << endl…

2013-14红军利物浦赛季总结

本文首发于懂球帝 总览 本赛季红军利物浦如好莱坞大片般的剧情&#xff0c;跌宕起伏扣人心弦&#xff0c;有喜悦&#xff0c;也有遗憾&#xff0c;最后几轮争冠历程的虐心程度堪比韩剧。随着纽卡比赛的终场哨响&#xff0c;KOP们心里五味杂陈&#xff0c;不知是如释重负&#x…

清华连续三年稳坐亚洲第一!西交利物浦成今年黑马 | 2021泰晤士亚洲大学排名...

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 作者丨金磊 博雯 来源丨量子位 编辑丨极市平台 导读 2021泰晤士亚洲大学排名&#xff0c;新鲜出炉。内地共有15所高校排名进入前50名&#xff0c;创造新纪录。 2021泰晤士…

利物浦有望成为全球第一个气候友好城市

点击上方 “蓝色字” 可关注我们&#xff01; 暴走时评&#xff1a; 利物浦市议会&#xff08;LCC&#xff09;宣布将利用区块链技术缓解气候问题带来的影响。LCC发布推文解释说将努力减少城市气候影响&#xff0c;计划到2020年成为全球第一个气候友好型城市&#xff0c;与波塞…

西交利物浦大学_CST专业_为自学而生

本篇文章编录的内容是为了帮助西交利物浦大学大二CST专业学生&#xff0c;以实现自主学习。 具体课程内容借鉴于Iscream学长的个人经历与知乎上的回答&#xff0c;在此对学长表示感谢。 文章目录 一、Electrical and Electronic Engineering1.EEE1032.EEE1043.EEE1094.EEE112 二…

西交利物浦计算机分数,2021年西交利物浦大学投档线及各省最低录取分数线统计表...

2018-2019年西交利物浦大学投档线及各省最低录取分数线统计表 高考填报志愿的时候&#xff0c;查询每个院校投档分数线是志愿填报信息的必要一步。那么什么是投档线呢&#xff1f;高考院校投档线是指以院校为单位&#xff0c;按招生院校同一科类(如文科或理科)招生计划数的一定…

西交利物浦计算机分数,考多少分才能上西交利物浦大学 录取分数是多少

今年高考多少分才能上西交利物浦大学&#xff1f;高考结束后就是高考志愿填报的时间了&#xff0c;无数梦想上西交利物浦大学的同学们都会有相同的问题&#xff0c;但是&#xff0c;高三网小编要告诉大家的是具体的分数线是要录取完后才公布的&#xff0c;于是小编总结了共有几…