中间件是开箱即用的吗?为什么要开发中间件adapter?
内容提要
本文讨论了商用系统中对中间件的适配需求,介绍了中间件adapter的作用和原因。商用系统对中间件的需求包括监控、告警、证书、备份、容灾和自动化能力。通过adapter可以实现这些需求,无需修改中间件源码。文章强调了在商用系统中选择使用团队常用的、资源占用少的语言来开发中间件adapter是更好的选择。
延伸解读
adapter的适用边界:并非所有能力都能外挂
文章指出,adapter能实现监控、告警、备份、容灾、自动化部署、接口封装和服务发现等适配,但证书轮换涉及TLS握手关键流程,adapter无法干涉,只能对中间件进行侵入式修改。这说明adapter并非万能,在规划中间件商用化时,需先区分哪些能力可外挂、哪些必须改源码,避免对adapter能力产生不切实际的预期。
选择adapter语言的两个务实标准
文章建议使用团队常用的、资源占用少的语言开发中间件adapter。团队常用意味着维护成本低、排障容易;资源占用少则因为adapter与中间件运行在同一物理机或容器中,需避免挤占中间件资源。这一选择也绕开了修改中间件源码时可能遇到的语言不兼容问题,例如Java团队维护Erlang写的RabbitMQ。
服务发现配置:域名优于IP的运维逻辑
文章强调应用程序连接中间件应配置域名而非IP,因为IP会随容器生命周期变化。应用程序通常不会因中间件容器重启而重建客户端,而是通过重连连到新容器;运维人员也无法时刻盯着IP变化改配置。使用可修改的静态域名配置,还能继承蓝绿、灰度发布能力,降低容器化环境下的运维负担。
Q&A
中间件adapter是什么?它主要解决什么问题?
中间件adapter是指与中间件运行在同一物理机或容器中的组件,用于将中间件与商用系统中已有组件对接,使其达到商用标准。它主要解决中间件原生功能无法满足商用系统监控、告警、证书、备份、容灾、自动化等需求的问题,而无需修改中间件源码。
为什么不直接修改中间件源码来满足商用需求?
修改源码虽然能实现功能,但维护困难:非社区通用需求无法合并到主干,每次版本升级需重复修改;社区大版本重构可能导致修改难以持续;且源码语言可能与团队技术栈不同(如Java团队维护Erlang写的RabbitMQ),修改门槛高。
商用系统对中间件通常有哪些能力诉求?
商用系统通常要求中间件能适配原有监控系统、告警系统、证书系统、备份系统(有状态时)、容灾系统(有状态时),具备自动化能力(部署、账号创建、权限策略创建),对外暴露时封装接口,以及应用程序与中间件的服务发现。
adapter如何帮助中间件适配监控和告警系统?
对于监控,adapter可以从中间件获取监控数据(推或拉模式),再与监控系统对接;对于告警,adapter可以识别中间件是否发生不可恢复错误(如写事务文件失败、操作ZooKeeper元数据失败),并触发告警系统发出告警。
证书轮换能否通过adapter实现?
不能。证书轮换涉及TLS握手关键流程,adapter无法干涉,只能对中间件进行侵入式修改。开源中间件几乎都不支持动态证书轮换,而商用系统必须支持,因此这部分需要修改源码。
应用程序连接中间件时为什么推荐使用域名而非IP?
在Kubernetes等容器化部署中,IP会随容器生命周期变化。使用域名可以避免因容器重启导致IP变更而需要重新配置,应用程序通过重连即可继续工作,运维人员也无需时刻关注IP变化。
开发中间件adapter时选择什么语言比较好?
建议选择团队常用的、资源占用少的语言。这样可以利用团队技术栈降低开发维护成本,同时减少adapter对中间件运行资源的额外消耗。