面试:ShardingSphere问题
文章目录
- 什么是ShardingSphere,它的主要功能是什么?
- ShardingSphere的核心模块有哪些?他们是如何工作的?
- ShardingSphere 的读写分离是如何实现的?
- 如何配置ShardingSphere的数据分片策略?
- ShardingSphere支持水平分片和垂直分片吗?请解释 它们的区别。
- 什么是ShardingSphere的广播表?
- 什么是 ShardingSphere 的关联表?
- ShardingSphere支持哪些分片算法?
- ShardingSpehre 的分库分表功能是如何工作的?
- ShardingSphere如何保证分布式事务一致性?
- 如何使用 ShardingSphere 进行数据加密?
什么是ShardingSphere,它的主要功能是什么?
ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,主要由 JDBC、Proxy 组成。这两个产品均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
ShardingSphere是一个功能强大的数据库中间件,可用于解决分布式数据库架构中的多种挑战,包括数据分片、读写分离、分布式事务、影子库、数据加密等,从而提高了系统的性能、扩展性和可用性。
ShardingSphere 保留了非常多的功能扩展。通过使用 ShardingSphere,开发者可以无需修改原有业务代码,即可实现数据库的水平扩展和垂直拆分。
ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展,从而满足更多定制化的需求。
另外,ShardingSphere 还针对分库分表场景,致力于设计并实现一整套分库分表的解决方案,包括数据迁移、冷热数据分离等一系列的问题。
ShardingSphere的核心模块有哪些?他们是如何工作的?
ShardingSphere 是一个分布式数据库中间件,它由多个核心模块组成,包括 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar。
- Sharding-JDBC 是 ShardingSphere 的核心模块之一,它提供了一个轻量级的 Java 框架,在 Java 的 JDBC 层提供额外的服务。使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。Sharding-JDBC主要用于嵌入到应用程序中,使应用程序能够透明地使用分片和读写分离功能,而无需对应用程序进行大规模修改。
- Sharding-Proxy 是 ShardingSphere 的另一核心模块,它以代理的形式部署在应用程序与数据库之间,实现了对 SQL 的解析和改写以及请求的转发。用户无需修改任何应用程序代码,只需通过配置文件或 API 接口进行分片规则设置,即可实现数据分片和读写分离等功能。Sharding-Proxy主要用于需要将数据库访问透明地分片化的情况,而不想在应用程序中引入Sharding-JDBC的情况。它也可以用于监控和审计数据库操作。
- Sharding-Sidecar 是 ShardingSphere 的规划中的第三个模块,它将作为一个独立的微服务,为用户提供更为灵活和强大的数据分片、分布式事务和数据治理等功能。Sarding-SideCar 主要用于云原生环境。
总体来说,ShardingSphere 的三个核心模块通过相互配合,共同实现了数据库的分片和分布式事务等功能的解决方案。开发人员可以根据其应用程序的要求选择合适的模块来集成ShardingSphere。这些模块共同为分布式数据库操作提供了更好的性能、可扩展性和可用性。
ShardingSphere 的读写分离是如何实现的?
读写分离是ShardingSphere 的重要功能。主要负责将 SQL 语句根据他们的执行逻辑不同,路由到不同的数据库中执行。读写分离功能只负责 SQL 路由,而不负责不同数据库之间的数据同步。通常,MySQL 的数据同步是通过 MySQL 主从集群机制完成。要在ShardingSphere中实现读写分离功能,主要通过以下几个步骤:
- 数据源配置:首先,在应用程序的配置中,你需要配置多个数据库数据源,包括主库(用于写操作)和多个从库(用于读操作)。每个数据源都有一个唯一的名称和连接信息。
- SQL解析:当应用程序发送SQL查询请求时,ShardingSphere的SQL 执行引擎会拦截并解析SQL语句。
- 读写分离规则:ShardingSphere通过读写分离规则来确定查询应该发送到主库还是从库。这些规则可以在配置文件中定义,通常基于SQL的类型(SELECT、INSERT、UPDATE、DELETE)来决定路由。
- 路由查询:根据读写分离规则,Sharding-JDBC将查询请求路由到适当的数据源。如果是SELECT查询,它将路由到一个从库;如果是INSERT、UPDATE或DELETE操作,它将路由到主库。这确保了写操作总是发送到主库,而读操作可以发送到从库,以分担主库的负载。
- 执行查询:一旦确定了目标数据源,Sharding-JDBC会将查询请求转发到相应的数据库。主库用于写操作,从库用于读操作。
- 返回结果:数据库执行查询后,将结果返回给Sharding-JDBC,然后Sharding-JDBC将结果返回给应用程序。
ShardingSphere的读写分离实现主要依赖于SQL解析和读写分离规则。通过解析SQL语句,它能够识别查询类型并将其路由到适当的数据库数据源。这使得应用程序可以实现自动的读写分离,从而提高了系统性能和负载均衡。开发人员只需配置好数据源和读写分离规则,ShardingSphere会自动处理剩下的工作。具体的配置方式,根据 ShardingSphere 版本不同会略有不同。
如何配置ShardingSphere的数据分片策略?
在ShardingSphere中配置数据分片策略涉及到定义如何将数据分布到不同的数据库和表中,以满足分库分表的需求。通常按照以下步骤来配置一个数据分片策略:
- 配置数据源:在 ShardingSphere 的配置文件中,配置多个数据源,每个数据源对应一个数据库实例。
- 配置逻辑表: 在配置文件中,配置多个逻辑表。每个逻辑表对应一个或多个真实数据表。
- 配置逻辑表的主键生成策略:分库分表场景下,主键不能由数据库本地生成,所以通常会在 ShardingSphere 中配置主键生成策略,用来在分布式场景下,给逻辑表的每一条记录生成一个唯一的主键
- 配置逻辑表的分库策略和分表策略:分别配置逻辑表的分库策略和分表策略。在配置策略时,一般先配置逻辑表的分片键,也就是按哪个字段分片。然后配置对应的分片算法,也就是按什么规则进行分片。常用的分片算法有取模算法、哈希算法等,也可以自定义复杂算法。
- 补充一些其他规则:根据具体业务要求,配置一些补充的规则。例如敏感数据加密、广播表、绑定表、影子库等。
ShardingSphere支持水平分片和垂直分片吗?请解释 它们的区别。
ShardingSphere是支持水平分片和垂直分片的,但它们的区别在于:
- 垂直分片:是在应用层面上进行的一种策略,它主要是为了解决单台数据库性能瓶颈的问题,将数据根据业务逻辑分类进行分片存储。每个表中的数据会被分散到不同的数据库中。它的优点是能够减轻单个库的负载压力,方便数据维护等;缺点是没有根本解决单库数据量过大、并发性高的性能瓶颈,并且可能会产生跨服务的事务一致性问题。在应用模块间存在较强耦合关系的情况下,这种策略可能更适合使用。
- 水平分片:是在数据库层面上进行的一种策略,能够将数据根据某种规则分散至多个库或表中,每个分片仅包含数据的一部分。例如,可以根据某个字段(或某几个字段),如主键进行分片存储。这种策略可以有效地解决单库数据量过大、并发性高的性能瓶颈,提高系统的稳定性和负载能力。水平分片在理论上突破了单机数据量处理的瓶颈,并且扩展相对自由,是分库分表的标准解决方案。
在实际应用中,可以同时使用水平和垂直分片,根据具体业务需求来设计复杂的分片策略,以实现更好的性能、可扩展性和数据管理。ShardingSphere提供了支持这两种分片方式的功能,以满足不同应用场景的需求。
什么是ShardingSphere的广播表?
ShardingSphere的广播表是指存在于每个分片数据源中的表。这些表的结构和数据在每个数据库中都完全一致。这种表适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如字典表、省份信息等。对于广播表,ShardingSphere不会对数据进行分片,所有节点的数据都是完全一致的。当有新的插入、更新操作时,它们会实时在所有节点上执行,以保证各个分片的数据一致性。查询操作只需要从一个节点获取,而不是从多个节点获取。同时,广播表可以与任何一个表进行JOIN操作。在ShardingSphere中,可以通过创建广播表的方式来实现广播表的功能。
在ShardingSphere中,开发人员可以配置广播表,使其在分片集群中自动生效。广播表的使用可以简化分布式系统中的数据管理,确保全局数据的一致性,同时降低了查询广播表的复杂性。
什么是 ShardingSphere 的关联表?
ShardingSphere提供了关联表的功能,主要解决在进行多表关联查询时,容易出现的查询效率太低的问题。
具体来说,关联表定义了一种映射关系,将不同分片表的某些字段对应起来。这样,在进行多表关联查询时,ShardingSphere就可以通过这个映射关系,将查询操作转换成分片表的本地查询操作。这样就可以避免跨节点、跨数据库的查询,提高了查询效率。
例如,如果有两个表:订单表(t_order)和订单情表表(t_order_item),它们之间存在一个外键关联关系。我们可以定义一个关联规则,将这两个表关联起来。当进行多表关联查询时,ShardingSphere就会根据这个关联规则,自动将分片键相同的表关联起来进行查询,从而提高查询的效率。
ShardingSphere支持哪些分片算法?
ShardingSphere支持多种分片算法,主要包括:
- 精确分片算法(PreciseShardingAlgorithm):用于处理使用单一键作为分片键的=与IN进行分片的场景。
- 范围分片算法(RangeShardingAlgorithm):用于处理使用单一键作为分片键的BETWEEN AND、>、<、>=、<=进行分片的场景。
- 复合分片算法(ComplexKeysShardingAlgorithm):用于处理使用多键作为分片键进行分片的场景,多个分片键的逻辑较复杂,需要应用开发者自行处理其中的复杂度。
- 提示分片算法(HintShardingAlgorithm):用于处理分片规则与 SQL 无关的场景。对于分片字段非SQL决定,而由其他外置条件决定的场景,可使用SQL Hint灵活的注入分片字段。
此外,随着版本不断演进,ShardingSphere还在不断丰富分片算法,例如基于分片边界的范围分片算法(BoundaryBasedRangeShardingAlgorithm)、基于分片容量的范围分片算法(VolumeBasedRangeShardingAlgorithm)等。
ShardingSpehre 的分库分表功能是如何工作的?
ShardingSphere 的分库分表功能主要通过如下几个步骤完成:
- 配置管控:ShardingSphere 需要解析复杂的配置信息,并且支持将配置信息上传到第三方注册中心。
- SQL 解析:将要执行的 SQL 语句解析成抽象语法树。
- SQL 路由:根据解析上下文匹配数据库和表的分片策略,并生成 SQL 的路由路径。
- SQL 优化:用户只需要面向逻辑库和逻辑表来写SQL,最终由ShardigSphere的改写引擎将SQL改写为在真实数据库中可以正确执行的语句。SQL改写分为正确性改写和优化改写。
- SQL 执行:ShardingSphere 采用一套自动化的执行引擎,负责将路由和改写完成之后的真实 SQL 安全且高效发送到底层数据源执行。
- 结果归并:将从各个数据节点获取的多数据结果集,组合成为一个结果集并正确的返回至请求客户端。ShardingSphere 内部实现了流式归并和内存归并两种方案。
ShardingSphere 的分库分表功能使得应用程序能够透明地访问分布式数据库,而无需关心具体的数据库分片细节。开发人员只需配置好数据源和分片规则,ShardingSphere会自动处理数据的分布和查询路由。这有助于提高系统性能、可扩展性和可用性。
ShardingSphere如何保证分布式事务一致性?
ShardingSphere 保证分布式事务一致性的方式主要有两种:XA事务和柔性事务。
- XA事务通过在准备阶段和提交阶段进行两阶段锁,来保证分布式事务的一致性。在准备阶段,ShardingSphere 会对所有的数据库节点进行锁定,保证在事务执行过程中不会有其他操作干扰。在提交阶段,ShardingSphere 会对所有的数据库节点进行提交或者回滚操作,以保证事务的一致性。
- 柔性事务则是通过BASE理论来实现的。BASE理论包括基本可用(Basically Available)、软状态(Soft State)和最终一致性(EventualConsistency)。在柔性事务中,ShardingSphere 采用了柔性状态和最终一致性的理念,允许短时间内不同步,最终保证数据的一致性。
另外,ShardingSphere 还提供了接入分布式事务的 SPI,并针对性能要求较高、一致性要求较低的业务提供了基于柔性事务的方案。在整合Seata AT事务时,ShardingSphere 通过扩展服务间的传输机制,将Seata的全局事务上下文传递到分片执行引擎中,从而保证了分布式事务的一致性。
总之,ShardingSphere 通过XA事务和柔性事务两种方式来保证分布式事务的一致性。在实现过程中,ShardingSphere 还提供了相应的工具类和抽象类,方便开发者进行相关操作。
如何使用 ShardingSphere 进行数据加密?
ShardingSphere 的数据加密功能配置主要分为以下步骤:
- 数据源配置:首先需要配置数据源信息,包括数据源的名称、连接池等信息。
- 加密算法配置:在 ShardingSphere 中内置了一些常见的加密算法,例如 AES、MD5、RC4、SM3 和 SM4,用户可以选择其中一种或多种算法进行加解密操作。同时,用户也可以通过实现 ShardingSphere 提供的接口来自定义加密算法。
- 加密表配置:该步骤主要用于配置数据表里哪个列为密文数据(cipherColumn)、使用什么算法进行加解密(encryptorName)、哪个列为辅助查询数据(assistedQueryColumn)、使用什么算法进行加解密(assistedQueryEncryptorName)、哪个列为明文数据(plainColumn)以及使用哪个列进行 SQL 编写(logicColumn)。
通过以上步骤,用户可以完成 ShardingSphere 数据加密功能的配置。
相关文章:
面试:ShardingSphere问题
文章目录 什么是ShardingSphere,它的主要功能是什么?ShardingSphere的核心模块有哪些?他们是如何工作的?ShardingSphere 的读写分离是如何实现的?如何配置ShardingSphere的数据分片策略?ShardingSphere支持…...
NX二次开发UF_CURVE_ask_offset_direction_2 函数介绍
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_offset_direction_2 Defined in: uf_curve.h int UF_CURVE_ask_offset_direction_2(UF_STRING_p_t input_curves, double offset_direction_vector [ 3 ] , double dra…...
【研究中】sql server权限用户设置23.11.26
--更新时间2023.11.26 21:30 负责人:jerrysuse DBAliCMSIF EXISTS (select * from sysobjects where namehkcms_user)--判断是否存在此表DROP TABLE hkcms_user CREATE TABLE hkcms_user (id int primary key identity(1, 1),username char(32) NOT N…...
java多线程一
1、什么是线程 线程(Thread)是一条程序内部的一条执行流程。 程序中如果只有一条执行流程,那这个程序就是单线程的程序。 2、什么是多线程 多线程(multithreading),是指从软件或者硬件上实现多个线程并发执…...
电脑技巧:电脑常见蓝屏、上不了网等故障及解决办法
目录 一、电脑蓝屏 常见原因1: 病毒木马 常见原因2: 安装了不兼容的软件 二、电脑不能上网 常见原因1: 新装系统无驱动 常见原因2: DNS服务器异常 常见原因3: 硬件问题 三、电脑没声音 常见原因1: 未安装驱动 常见原因2: 硬件故障 四、电脑屏幕不显示 常见原因1: 显…...
大语言模型损失函数详解
我们可以把语言模型分为两类: 自动回归式语言模型:自动回归式语言模型在本质上是单向的,也就是说,它只沿着一个方向阅读句子。正向(从左到右)预测;反向(从右到左)预测。…...
Spring Boot 3 集成 Knife4j
基础环境 SpringBoot : 3.0.6 Java: jdk-17.0.5 Maven: 3.6.1依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xs…...
BetaFlight模块设计之三十六:SoftSerial
BetaFlight模块设计之三十六:SoftSerial 1. 源由2. API接口2.1 openSoftSerial2.2 onSerialRxPinChange2.3 onSerialTimerOverflow2.4 processTxState2.5 processRxState 3. 辅助函数3.1 applyChangedBits3.2 extractAndStoreRxByte3.3 prepareForNextRxByte 4. 总结…...
PC访问华为昇腾开发板的摸索过程
作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 最近要折腾华为昇腾开发板(官方名称叫:Atlas 200I DK)。先是按照官方教程折腾:Atlas200DK环境部署。我发现…...
C++学习之路(六)C++ 实现简单的工具箱系统命令行应用 - 示例代码拆分讲解
简单的工具箱系统示例介绍: 这个示例展示了一个简单的工具箱框架,它涉及了几个关键概念和知识点: 面向对象编程 (OOP):使用了类和继承的概念。Tool 是一个纯虚类,CalculatorTool 和 FileReaderTool 是其派生类。 多态࿱…...
redis运维(十四) hash缓存案例
一 缓存案例 ① 需求 ② 个人理解 策略:不更新缓存,而是删除缓存大部分观点认为:1、做缓存不应该是去更新缓存,而是应该删除缓存2、然后由下个请求去缓存,发现不存在后再读取数据库,写入redis缓存 高并发场景下,到底先更新缓存还是先更…...
Rust UI开发(三):iced如何打开图片(对话框)并在窗口显示图片?
注:此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。 这是一个系列博文,本文是第三篇,前两篇的链接: 1、Rust UI开发(一):使用iced构建…...
网络爬虫(Python:Requests、Beautiful Soup笔记)
网络爬虫(Python:Requests、Beautiful Soup笔记) 网络协议简要介绍一。OSI参考模型二、TCP/IP参考模型对应关系TCP/IP各层实现的协议应用层传输层网络层 HTTP协议HTTP请求HTTP响应HTTP状态码 Requests(Python)Requests…...
【Kotlin】内联函数
文章目录 内联函数noinline: 避免参数被内联非局部返回使用标签实现Lambda非局部返回为什么要设计noinline crossinline具体化参数类型 Kotlin中的内联函数之所以被设计出来,主要是为了优化Kotlin支持Lambda表达式之后所带来的开销。然而,在Java中我们似…...
Unity技美35——再URP管线环境下,配置post后期效果插件(post processing)
前两年在我的unity文章第10篇写过,后效滤镜的使用,那时候大部分项目用的还是unity的基础管线,stander管线。 但是现在随着unity的发展,大部分项目都用了URO管线,甚至很多PC端用的都是高效果的HDRP管线,这就…...
Redis:持久化RDB和AOF
目录 概述RDB持久化流程指定备份文件的名称指定备份文件存放的目录触发RDB备份redis.conf 其他一些配置rdb的备份和恢复优缺点停止RDB AOF持久化流程AOF启动/修复/恢复AOF同步频率设置rewrite压缩原理触发机制重写流程no-appendfsync-on-rewrite 优缺点 如何选择 概述 Redis是…...
基于python协同过滤推荐算法的音乐推荐与管理系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Python的协同过滤推荐算法的音乐推荐与管理系统是一个集成了音乐推荐和管理的系统,它使用协同过滤算…...
【极客技术】真假GPT-4?微调 Llama 2 以替代 GPT-3.5/4 已然可行!
近日小编在使用最新版GPT-4-Turbo模型(主要特点是支持128k输入和知识库截止日期是2023年4月)时,发现不同商家提供的模型回复出现不一致的情况,尤其是模型均承认自己知识库达到2023年4月,但当我们细问时,Fak…...
STK Components 二次开发-创建地面站
1.地面站只需要知道地面站的经纬高。 // Define the location of the facility using cartographic coordinates.var location new Cartographic(Trig.DegreesToRadians(-75.596766667), Trig.DegreesToRadians(40.0388333333), 0.0); 2.创建地面站 创建方式和卫星一样生成对…...
数据结构与算法(三)贪心算法(Java)
目录 一、简介1.1 定义1.2 基本步骤1.3 优缺点 二、经典示例2.1 选择排序2.2 背包问题 三、经典反例:找零钱3.1 题目3.2 解答3.3 记忆化搜索实现3.4 动态规划实现 一、简介 1.1 定义 贪心算法(Greedy Algorithm),又名贪婪法&…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
