计算机软件-术语-什么叫中间件
目的辨析基础概念正确理解技术本质背景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中间件隐藏了请求解析、认证、日志等横切逻辑左边只管业务消息中间件隐藏了网络通信、负载均衡、消息持久化生产者只管发消息数据库中间件隐藏了分库分表、读写分离应用只管写SQLLangChain中间件隐藏了Token统计、重试逻辑、流式处理编排逻辑只管调用2、对右边——提供标准接口解耦左边变化中间件类型对右边隐藏了什么Web中间件后端应用不关心请求来自Web端还是移动端消息中间件消费者不关心生产者是Java还是Python数据库中间件数据库不关心是哪个应用在查询也不关心分片策略LangChain中间件LLM API不关心是哪个Agent在调用也不关心调用频率3、自身——不包含业务逻辑只处理横切关注点组件类型包含业务逻辑例子左边组件✅ 包含业务逻辑Controller里计算订单金额、Agent里决策调用哪个工具中间件❌ 不包含业务逻辑日志记录、认证鉴权、限流、协议转换、消息路由右边组件✅ 包含业务逻辑数据库存储数据、LLM生成内容LangChain里的中间件LangChain里的中间件落点在横切关注点上类似Spring框架中的AOP或钩子函数是编码模块级的LangChain里的中间件处于流程之间位于智能体调用前后、模型调用前后、工具调用前后等用来处理日志记录、上下文压缩、隐私安全围栏、服务降级等非核心业务逻辑没有这些中间件LangChain中也可以通过原生编码的方式实现这些功能只是可能不够优雅、安全、稳定、高效、易维护