目的

辨析基础概念,正确理解技术本质

背景

1、技术圈概念浩繁,且大家对相同的概念往往理解不一,导致沟通不畅。如之前工作中,同事说微服务也是一种中间件,我说它是框架,使用它可能需要用到中间件,然后就被各种嘲讽。虽然事后证明我说的是对的,但被嘲讽期间的自我怀疑,也反映出自己对中间件这个概念的理解并不到位

技术圈争吵是一种有益现象,这使得理越辩越明,让个人快速成长(跟层次太低的人争吵除外)。期间的个人情绪,都是很次要的事情

2、最近在学习LangChain,它的重要组件之一就是中间件,但和传统软件领域的中间件概念又似乎不同,需要辨析清楚

内容

中间件的官方定义

  • 1、GB/T 33847-2017 《信息技术 中间件术语》中,对中间件的定义原文:位于系统软件之上,用于支持分布式应用软件,连接不同软件实体的支撑软件

  • 2、该定义相对抽象,官方给出了具体的示例:
    在这里插入图片描述

中间件到底在什么中间?

这是产生疑惑的根源,中间件的“”字,可以理解为组件(一个软件应用、一个代码模块等)。但“中间”二字是必须依靠“两边”来理解的,所以必须厘清:
1、左右两边是什么组件
2、是什么标准,区分某个组件是中间件而不是左右两边的组件。
在这里插入图片描述
先直接说答案:

1、左右两边是什么组件

左、中、右,一定是相同层级的组件(如都是应用级或者都是模块级),具体左右两边是什么,要具体问题具体分析,但总结来讲,不外以下四点:

中间件所处位置 左右两边
层级之间 如左边是应用层,右边是基础设施层
流程之间 如左边是用户请求,右边是业务处理逻辑
系统之间 如左边是A业务系统,右边是B业务系统
时间之间 如左边是智能体调用前的时刻,右边是智能体执行调用的时刻
示例
类型 介于什么之间 做什么
Web中间件 HTTP请求 ↔ 业务逻辑 鉴权、日志、解析
消息中间件 生产者 ↔ 消费者 解耦、缓冲、路由
数据库中间件 应用 ↔ 数据库 分库分表、读写分离
RPC框架 调用方 ↔ 服务提供方 服务发现、负载均衡
事务中间件 多个数据库/服务之间 分布式事务协调
API网关 客户端 ↔ 微服务集群 路由、限流、聚合

2、是什么标准,区分某个组件是中间件而不是左右两边的组件

  • 中间件位于两个组件中间,因此作为起始和结束端点的组件不是中间件

因此浏览器不是中间件,它往往是作为起始点。数据库不是中间件,它往往是结束点。
如果将Redis作为缓存,它是缓存中间件;如果将Redis作为MQ,它是消息中间件;如果将Redis当作数据库,它就变成了结束点,不再是中间件(因为位置不在中间)

  • 中间件是管道工,是软件胶水,本身不生产和处理业务,没有也行,但有了会让业务运转得更好

因此业务应用不是中间件,它承载和处理业务,对业务而言必不可少。
但将业务应用托管起来的Web服务器如Tomcat、Apache、Nginx是中间件,它们左侧连接来自浏览器的用户请求,右侧连接业务应用,本身不生产和处理业务。即使没有Web服务器,业务应用也能通过原生编码的方式实现Web服务器的功能(如编码实现HttpServer、SocketServer)。但有了Web服务器后,性能、稳定性、安全性、可维护性等各方面都有所优化

  • 基础设施不是中间件

操作系统、文件系统、网络、数据库、大模型服务,这些都是基础设施,他们不是中间件
但为方便使用基础设施,而加的封装层,是中间件。如数据库中间件是对数据库的封装,AI网关是对大模型服务的封装,他们都是中间件

中间件的作用/特征

1、对左边——提供抽象,隐藏右边复杂性

中间件类型 对左边隐藏了什么
Web中间件 隐藏了请求解析、认证、日志等横切逻辑,左边只管业务
消息中间件 隐藏了网络通信、负载均衡、消息持久化,生产者只管发消息
数据库中间件 隐藏了分库分表、读写分离,应用只管写SQL
LangChain中间件 隐藏了Token统计、重试逻辑、流式处理,编排逻辑只管调用

2、对右边——提供标准接口,解耦左边变化

中间件类型 对右边隐藏了什么
Web中间件 后端应用不关心请求来自Web端还是移动端
消息中间件 消费者不关心生产者是Java还是Python
数据库中间件 数据库不关心是哪个应用在查询,也不关心分片策略
LangChain中间件 LLM API不关心是哪个Agent在调用,也不关心调用频率

3、自身——不包含业务逻辑,只处理横切关注点

组件类型 包含业务逻辑? 例子
左边组件 ✅ 包含业务逻辑 Controller里计算订单金额、Agent里决策调用哪个工具
中间件 ❌ 不包含业务逻辑 日志记录、认证鉴权、限流、协议转换、消息路由
右边组件 ✅ 包含业务逻辑 数据库存储数据、LLM生成内容

LangChain里的中间件

  • LangChain里的中间件,落点在横切关注点上,类似Spring框架中的AOP,或钩子函数,是编码模块级的
  • LangChain里的中间件,处于流程之间,位于智能体调用前后、模型调用前后、工具调用前后等,用来处理日志记录、上下文压缩、隐私安全围栏、服务降级等非核心业务逻辑
  • 没有这些中间件,LangChain中,也可以通过原生编码的方式,实现这些功能,只是可能不够优雅、安全、稳定、高效、易维护
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐