java中间件是什么意思_数据库中间件漫谈

f62c6d26d87793eb9d2ed002b4e186d2.png

1.前言

随着业务的发展,MySQL数据库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作的开销也会越来越大;另外,无论怎样升级硬件资源,单台服务器的资源(CPU、磁盘、内存、网络IO、事务数、连接数)总是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。

分表、分库和读写分离可以有效地减小单台数据库的压力。

本文主要针对业界主流的数据库中间件的实现、功能、成本等方面进行对比,总结数据库中间件的实现方式,并展望未来的可能发展。

2. 实现方式

一般来说,对于数据库中间件,可以在以下六个层次做切入。

e959a3963e4ef2d4af86f8c3a95a3914.png

2.1 代码层

在同一个项目中创建多个数据源,采用if else的方式,直接根据条件在代码中路由。

Spring中有动态切换数据源的抽象类,具体参见AbstractRoutingDataSource。

如果项目不是很庞大,使用这种方式能够快速的进行分库。但缺点也是显而易见的,这种海量的代码侵入是绝不能被接受的。

而且当查询结果返回时,需要对跨库、聚合等查询结果进行归并,开发工作量非常巨大。

这种方式了解一下即可,一般不会去使用。

2.2 框架层

主要是修改或增强现有ORM框架的功能,在SQL中增加一些自定义原语或者hint来实现。

常见的比如实现一些拦截器(比如Mybatis的Interceptor接口),增加一些自定义解析来控制数据的流向,效果虽然较好,但会改变一些现有的编程经验。

这种情况适合公司ORM框架统一的情况,但在很多情况下不太现实。

而且大部分情况下要修改框架源码,因此,也不推荐。

2.3 驱动层

无论是从代码层还是框架层做处理,都是高侵入、难维护的。

因此,常见的数据库中间件,至少需要从驱动层开始,我们可以理解为一个smart-client。

什么意思是smart-client呢?

通常smart-client是在连接池或者driver的基础上进行了一层封装。

这个smart-client内部可以与不同的数据库建立连接。

服务需要查询的sql,就交给smart-client进行解析、优化,然后发送给具体的数据库进行操作。

例如在读写分离情况下,smart-client会选择sql走从库还是主库;在分库分表的情况下,进行sql解析、sql改写等操作,然后路由到不同的分库,将得到的结果进行合并,返回给应用。

8efabe82828e873b557299e2ee1d652e.png

我们熟知的TDDL、Sharding-JDBC等,都是在此层切入。

优点:

1)实现方便,业务无入侵。smart-client不需要实现客户端通信协议,只需要在数据数据库厂商提供的不同语言的数据库驱动上做封装即可。例如mysql针对java语言提供了mysql-connector-java驱动,针对python提供了mysql-connector-python驱动。

2)天然去中心化。smart-client以sdk的方式被应用引入,然后部署到不同的服务节点上,不需要有代理层proxy。因此相较于代理方式而言,不需要考虑高可用的问题。只要应用的节点没有全部宕机,就可以访问数据库。(这里的高可用是相比代理层proxy而言,数据库本身的高可用还是需要保证的)

缺点:

1)通常仅支持某一种语言。例如tddl、zebra、sharding-jdbc都是使用java语言开发,因此对于使用其他语言的用户,就无法使用这些中间件。如果其他语言要使用,那么就要开发多语言客户端。

2)版本升级困难。因为应用使用数据源代理就是引入一个jar包的依赖,在有多个应用都对某个版本的jar包产生依赖时,一旦这个版本有bug,所有的应用都需要升级。而数据库代理升级则相对容易,因为服务是单独部署的,只要升级这个代理服务器,所有连接到这个代理的应用自然也就相当于都升级了。

3)去中心化的缺点,比如无法做全局的sql限流

2.4 代理层

在应用中,我们通过一个普通的数据源(c3p0、druid、dbcp等)与代理服务器建立连接,所有的sql操作语句都是发送给这个代理,由这个代理去操作底层数据库,得到结果并返回给应用。在这种方案下,分库分表和读写分离的逻辑对开发人员是完全透明的。

bc0026e4b67bfa46932ee37d819bd4ba.png

像MySQL Router、MyCat、ShardingSphere(proxy模式)等,都是在此层切入。

优点:

1)多语言支持。也就是说,不论你用的php、java或是其他语言,都可以支持。以mysql数据库为例,如果proxy本身实现了mysql的通信协议,那么你可以就将其看成一个mysql 服务器,因此不同语言的开发者都可以使用mysql官方提供的对应的驱动来与这个代理服务器建通信。

2)对业务开发同学透明。由于可以把proxy当成mysql服务器,理论上业务同学不需要进行太多代码改造,既可以完成接入。

缺点:

1)实现复杂。因为proxy需要实现被代理的数据库server端的通信协议,实现难度较大。

2)proxy本身需要保证高可用。由于应用本来是直接访问数据库,现在改成了访问proxy,意味着proxy必须保证高可用。否则,数据库没有宕机,proxy挂了,导致数据库无法正常访问,就尴尬了。

3)租户隔离。可能有多个应用访问proxy代理的底层数据库,必然会对proxy自身的内存、网络、cpu等产生资源竞争,proxy需要需要具备隔离的能力。

2.5 Sidecar

Sharding-Sidecar是ShardingSphere的第三个产品,目前仍然在规划中。 定位为Kubernetes或Mesos的云原生数据库代理,以DaemonSet的形式代理所有对数据库的访问。

通过无中心、零侵入的方案提供与数据库交互的的啮合层,即Database Mesh,又可称数据网格。 Database Mesh的关注重点在于如何将分布式的数据访问应用与数据库有机串联起来,它更加关注的是交互,是将杂乱无章的应用与数据库之间的交互有效的梳理。使用Database Mesh,访问数据库的应用和数据库终将形成一个巨大的网格体系,应用和数据库只需在网格体系中对号入座即可,它们都是被啮合层所治理的对象。

96f816c3c48215c7f1ccbb628d669c5b.png

优点:

分布式云原生的数据库中间件模式,集成了jdbc和proxy各自的优点,能满足高可用、跨语言、无感知升级等多种优势特性

缺点:

需要整体架构支持云原生体系

目前还没正式上线。

2.6 存储层

这个层次实际上不应该叫数据库中间件了,需要更换存储。

比如Aurora、polardb、tidb等分布式数据库,通过计算节点和存储节点分离,计算节点scale up,存储节点scale out的理念将公有云的关系数据库产品推向了一个新的高度。

这样一来,实际上已经不再需要传统的数据库中间件了,一切问题天然就不存在了。

3. 功能对比

从上文可以了解到,目前最主流的数据库中间件主要是从驱动层smart-client和代理层proxy切入的。

下面,我们来了解下业界主流的中间件产品在这两个层次的站队情况与实现的功能对比。

7d4b55d99733b01235b40cea34670584.png

其他还有比如:

Atlas、Kingshard、DBProxy、mysql router、MaxScale、58 Oceanus、ArkProxy、Ctrip DAL、Tsharding、Youtube vitess、网易DDB、Heisenberg、proxysql、Mango、DDAL、Datahekr、MTAtlas、

我们可以看到,基本各个大厂都撸过一遍自己的中间件产品。不过目前开源而且比较火的已经不多了,主要还是以shardingsphere为主。

我们从功能维度,来对比一下几个产品。

2b2a6fb6ca8df3eb12b139bd7dd6bb3a.png

4. 展望

从上文的分析可以看出,尽管目前主流的数据库中间件还是在smart-client和proxy两个层面进行处理的,但是,已经能看到未来的方向了。云原生的到来,估计会做进一步的降维打击。

一方面是作为sidecar的模式,可能会有一个新的阶段,比如shardingsphere推出sidecar模式后。

而另一方面,云数据库通过全新的计算存储分离的架构方式,打破传统关系型数据库的性能瓶颈,传统数据库中间件将不再需要关注,一切都将以数据库基础设施的形式提供给使用者。

都看到最后了,原创不易,点个关注,点个赞吧~
知识碎片重新梳理,构建Java知识图谱:https://github.com/saigu/JavaKnowledgeGraph(历史文章查阅非常方便)
扫码关注我的公众号“阿丸笔记”,第一时间获取最新更新。同时能免费获取海量Java技术栈电子书、各个大厂面试题哦。

dcd95373221a14802a2779fa5071fe3a.png

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

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

相关文章

kafka多个消费者消费一个topic_kafka:一文读懂消费者背后的那点quot;猫腻quot;

来自:z小赵前言经过前几篇文章的介绍,大致了解了生产者背后的运行原理。消息有生产就得有人去消费,今天我们就来介绍下消费端消费消息背后发生的那点事儿。文章概览消费者与消费组的“父子关系”。Repartition 触发时机。消费者与 ZK 的关系。…

MySQL 入门教程:初学者一学就会,零基础 MySQL 安装及增删改查入门

文章目录前言一、MySQL 的相关概念介绍二、Windows 下 MySQL 的配置2.1、MySQL 安装配置步骤2.2、MySQL 服务的启动、停止与卸载三、MySQL 脚本的基本组成四、MySQL 中的数据类型4.1、数字类型4.2、日期和时间4.3、字符串类型五、使用 MySQL 数据库5.1、登录到 MySQL5.2、创建一…

四大基本反应类型的关系_如何进入四大的咨询部门?

在会计行业,人人梦寐以求的职位,莫过于四大的财务咨询的岗位,第一咨询工作很高大上,第二没有其他职位那么幸苦,我从我的工作经历来讲讲,我是怎么进入咨询这个“真香”岗位的。首先,给大家说一个…

MySQL 异常:这一篇就够了,MySQL 抛出异常的几种常见解决方式小结

Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database! 几种解决方式小结 文章目录Could not open JDBC Connection for transaction; nested exception is java.sql…

vnc用户名 查看linux_vnc用户名未被识别,5步教你如何解决vnc用户名未被识别

在进行vnc使用时,很多小伙伴会出现用户名未被识别的情况,那如何解决vnc用户名未被识别呢?咱接着往下看。使用工具:IIS7服务器管理工具主程序界面图:官网地址:IIS7服务器管理工具作为IIS7服务器管理工具&…

IntelliJ IDEA 乱码:全网最全 4 种方法完美解决 IntelliJ IDEA 控制台中文乱码问题

文章目录前言一、修改当前 Web 项目 Tomcat Server 的虚拟机输出选项二、修改 IntelliJ IDEA 全局编码、项目编码、属性文件编码三、IntelliJ IDEA 中自定义虚拟机选项四、直接修改 IntelliJ IDEA 配置文件的编码信息五、修改成功乱码问题解决总结前言 IntelliJ IDEA 如果不进行…

JVM 调优 1:“精通 JVM 调优,有过 JVM 调优经验”简历敢写吗?薪资涨 5k 的技巧

文章目录前言一、部分大厂对于 JVM GC 的面试题1.1、百度1.2、顺丰1.3、京东1.4、淘宝1.5、阿里、蘑菇街二、Garbage Collectors(GC)作何使用三、GC 的十种类型四、JVM 的版本参数信息4.1、查看 Java 启动时所有默认的命令行参数4.2、查看 Java 启动时 G…

ip地址合不合法怎么看_电子印章合不合法?两部门再发意见认定

近日,最高法、国家发改委联合发布 《关于为新时代加快完善社会主义市场经济体制提供司法服务和保障的意见》以助力经济高质量发展、建设高标准市场体系为出发点和落脚点,从市场主体、产权保护、公平交易、市场秩序、民生保障、服务开放、高效解纷等七个方…

JVM 调优 2:GC 如何判断对象是否为垃圾,三色标记算法应用原理及存在的问题?

文章目录前言一、如何判断一个对象是否为垃圾?1.1、reference count(引用计数)1.2、reference count(引用计数)存在的问题二、Root Searching(根可达算法或根搜索算法)2.1、Root Searching 释义…

班尼机器人怎么拆_博鼎建筑科技外墙错台打磨机器人和外墙螺杆洞封堵机器人—自升造楼平台1+N执行器...

继上期的混凝土整平机和智能喷淋养护系统,本期给大家介绍的是实际应用在自升造楼平台外墙环轨车上的外墙错台打磨机器人和外墙螺杆洞封堵机器人。外墙错台打磨机器人传统外墙错台处理,需要人工拿凿具对外墙面错台进行凿平处理。凿具重、操作人工容易疲劳…

架构师基础必备:“腹有诗书气自华”,驰骋一线大厂不是梦,抓紧收藏

文章目录前言一、软件1.1、何为软件?1.2、计算机软件的分类1.2.1、系统软件1.2.2、应用软件1.3、软件系统体系结构1.3.1、C/S 结构(桌面应用程序)1.3.2、B/S 结构(Web 应用程序)1.3.3、Web 服务器与数据库服务器1.3.4、…

JDK 7-JDK 21:Oracle Java SE 支持路线图/Oracle Java SE Support Roadmap 持续更新

文章目录前言一、Oracle Java SE 产品版本二、Java SE 8 的公共更新结束三、参考文档总结前言 几十年来,Java 生态系统已经成功地经历了这个过程,经历了十次主要的平台修订。长期强大的向后兼容性保护了整个生态系统的投资。同时,随着时间的推…

multisim中轻触开关在哪_现货供应轻触开关|品质确保|厂家直销

轻触开关是现今社会生活当中不可或缺的电子元器件之一,那么大家在使用的过程当中是否注意到一些细节问题。首先,我们要注意产品的放置要尽量避免接触腐蚀性气体以及过于潮湿的环境,这样很容易造成产品的损坏,减少轻触开关的使用寿…

DDoS 攻击与防护(一):如何识别 DDoS 攻击?DDoS 防护 ADS 服务有哪些?

文章目录前言一、什么是 DDoS 防护 ADS?1.1、什么是 DDoS 攻击?1.2、如何识别 DDoS 攻击?1.3、从 Web 访问流程分析 DDoS 攻击1.4、DDoS 攻击类型二、DDoS 防护 ADS 介绍2.1、Anti-DDoS 流量清洗2.2、DDoS 原生高级防护2.3、DDoS 高防三、DDo…

收藏功能_六款多功能榻榻米,装完你家会大一半!超实用,收藏

原标题:六款多功能榻榻米,装完你家会大一半!超实用,收藏当今社会城市的生活压力大,在外日夜打拼,回到家中只想做一个慵懒派,随性舒适的榻榻米,功能样式丰富,能让你彻底释…

混凝土墙开洞_新乐专业混凝土切割报价适中

新乐专业混凝土切割报价适中粘碳纤维加固,屋顶加层。本公司采用目前的钢筋混凝土切割结构分离和水钻排孔技术。真正实现对不同规格和形状的桥梁、道路、烟囱、建筑立柱、钢筋砼墙体、砖混结构墙体、建筑大梁等建筑物、构筑物实施无损切割(传统的建筑改造或局部拆除分…

class触发后让另一个class加样式_Bootstrap的按钮组样式

将一系列的.btn包裹在.btn-group内&#xff0c;并使用我们提供的插件&#xff0c;可以实现选择按钮、选取块状区的行为功能。<div class"row mt-5 d-block"><div class"btn-group"><button class"btn btn-primary">Left</b…

bsp模型适用于图计算_【论文解读】目标检测之RFBnet模型

原创声明&#xff1a;本文为 SIGAI 原创文章&#xff0c;仅供个人学习使用&#xff0c;未经允许&#xff0c;不能用于商业目的。其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》&#xff0c;清华大学出版社&#xff0c;雷明著&#xff0c;由SI…

win10雷电3接口驱动_“雷电3”接口知识大科普

近年来部分高端笔记本电脑在接口上会采用一种叫“雷电3”的新接口。今天小编就为大家解读一下“雷电3”接口的特性。最早的雷电接口雷电接口是由Intel开发定制的、接口类型为mini DP&#xff0c;在雷电3接口出来之前&#xff0c;雷电1和雷电2都是作为在苹果MAC上使用的&#xf…

springboot怎么返回404_深度分析:SpringBoot异常捕获与封装处理,看完你学会了吗?...

简介日常开发过程中&#xff0c;难免有的程序会因为某些原因抛出异常&#xff0c;而这些异常一般都是利用try &#xff0c;catch的方式处理异常或者throw&#xff0c;throws的方式抛出异常不管。这种方法对于程序员来说处理也比较麻烦&#xff0c;对客户来说也不太友好&#xf…