【Kafka专栏 08】ZooKeeper的Watch机制:不就是个“小喇叭”吗?

作者名称:夏之以寒

作者简介:专注于Java和大数据领域,致力于探索技术的边界,分享前沿的实践和洞见

文章专栏:夏之以寒-kafka专栏

专栏介绍:本专栏旨在以浅显易懂的方式介绍Kafka的基本概念、核心组件和使用场景,一步步构建起消息队列和流处理的知识体系,无论是对分布式系统感兴趣,还是准备在大数据领域迈出第一步,本专栏都提供所需的一切资源、指导,以及相关面试题,立刻免费订阅,开启Kafka学习之旅!

文章目录

  • ZooKeeper的Watch机制:不就是个“小喇叭”吗?
    • 01 引言
    • 02 Watch机制的作用
      • 2.1 实时感知节点变化
        • 2.1.1 实时感知状态变化
        • 2.1.2 触发相应的处理措施
        • 2.1.3 减少轮询开销
        • 2.1.4 支持复杂的分布式协同
        • 2.1.5 容错和鲁棒性
        • 2.1.6 扩展性和可伸缩性
      • 2.2 触发回调处理
        • 2.2.1 实时性
        • 2.2.2 灵活性
        • 2.2.3 可扩展性
        • 2.2.4 可维护性
      • 2.3 降低网络开销
    • 03 Watch机制的实现原理
      • 3.1 数据结构
      • 3.2 一次性触发
      • 3.3 异步发送通知
        • 3.3.1 异步发送通知
        • 3.3.2 提高并发处理能力**:
        • 3.3.3 提高响应速度
        • 3.3.4 顺序保证
    • 04 Watch机制的使用场景
      • 4.1 分布式配置管理
      • 4.2 分布式锁
      • 4.3 分布式协调
      • 05 总结

ZooKeeper的Watch机制:不就是个“小喇叭”吗?

01 引言

ZooKeeper是一个分布式协调服务框架,用于维护配置信息、命名、提供分布式同步和提供组服务等。在ZooKeeper中,一个非常重要的功能就是Watch机制。Watch机制允许ZooKeeper客户端在某个ZNode(ZooKeeper中的数据节点)上注册一个监听器,当这个ZNode发生变化(如数据变更、子节点增减、节点删除等)时,ZooKeeper服务端会主动通知所有注册了该ZNode的Watch的客户端,告知它们ZNode的状态已经发生了变化。这种机制为分布式系统中的多个节点之间提供了实时感知对方状态变化的能力,从而保证了系统的协调性和一致性。

02 Watch机制的作用

2.1 实时感知节点变化

在分布式系统中,由于节点之间的通信和协作是异步的,因此如何实时感知到系统中其他节点的状态变化是一个关键问题。ZooKeeper的Watch机制正好解决了这个问题。通过注册Watch,客户端可以实时感知到它所关注的ZNode的状态变化,从而采取相应的处理措施。这种机制确保了分布式系统中各个节点之间的协同工作能够顺利进行。

以下是Watch机制如何确保分布式系统中各个节点之间协同工作能够顺利进行的详细解释:

2.1.1 实时感知状态变化

通过在ZNode上注册Watch,客户端能够实时地感知到该ZNode的状态变化。这种感知是实时的,因为一旦状态发生变化,服务端会立即发送通知给所有相关的客户端。

2.1.2 触发相应的处理措施

当客户端收到状态变化的通知后,它可以触发相应的处理措施。这些措施可能包括重新加载配置、执行某项任务、通知其他组件等。这种基于事件的响应方式使得客户端能够根据系统的实时状态来做出决策。

2.1.3 减少轮询开销

在没有Watch机制的情况下,客户端可能需要定期轮询ZooKeeper来获取ZNode的状态变化。这种方式不仅效率低下,而且会给ZooKeeper服务端带来额外的负载。而Watch机制允许客户端在状态发生变化时立即获得通知,从而避免了不必要的轮询开销。

2.1.4 支持复杂的分布式协同

通过在多个ZNode上注册Watch,客户端可以构建复杂的分布式协同逻辑。例如,一个分布式系统可能使用ZooKeeper来实现领导选举、分布式锁、服务发现等功能,而这些功能通常都需要实时感知其他节点的状态变化。

2.1.5 容错和鲁棒性

由于ZooKeeper客户端与服务端之间的连接是长连接的,且Watch机制是基于这种连接来实现的,因此它具有一定的容错能力。即使某个客户端暂时与ZooKeeper服务端失去了连接,只要连接恢复,它仍然可以重新注册Watch并继续接收状态变化的通知。

2.1.6 扩展性和可伸缩性

Watch机制是ZooKeeper分布式协调服务框架的一部分,它本身具有良好的扩展性和可伸缩性。随着分布式系统规模的扩大和节点数量的增加,ZooKeeper可以通过增加更多的服务器来提供更高性能的服务,而Watch机制仍然能够保持其高效性和实时性。

2.2 触发回调处理

当ZNode的状态发生变化时,ZooKeeper服务端会主动向注册了该ZNode的Watch的客户端发送通知。客户端在接收到通知后,可以触发相应的回调处理函数,执行相应的操作。这种回调处理机制使得客户端能够灵活地处理ZNode状态变化带来的各种情况,提高了系统的可扩展性和可维护性。

在ZooKeeper中,当ZNode(ZooKeeper中的数据节点)的状态发生变化时,ZooKeeper服务端会主动向之前注册了该ZNode的Watch的客户端发送通知。这种机制是ZooKeeper的核心特性之一,它允许客户端实时地感知到ZNode的状态变动,并据此触发相应的处理逻辑。

具体来说,当客户端对某个ZNode执行了读取操作(如getDatagetChildren等)并设置了Watch时,ZooKeeper服务端会记住这个客户端与ZNode的关联关系。此后,一旦该ZNode的状态发生变化(例如数据内容被修改、子节点被添加或删除、节点本身被删除等),服务端就会触发事件,并将通知发送给所有之前注册了Watch的客户端。

客户端在接收到服务端发送的通知后,可以编写相应的回调处理函数(Callback Handler)来执行特定的操作。这些操作可能包括重新读取ZNode的最新状态、触发某个业务流程、更新本地缓存等。由于ZooKeeper的通知是事件驱动的,客户端可以根据实际需求灵活地处理这些事件,而无需持续轮询ZNode的状态。

这种回调处理机制为分布式系统带来了诸多好处:

2.2.1 实时性

客户端能够立即感知到ZNode的状态变化,从而迅速做出响应。这对于需要实时同步数据的分布式系统来说至关重要。

2.2.2 灵活性

客户端可以根据具体的业务逻辑来编写回调处理函数,处理各种可能的ZNode状态变化。这种灵活性使得ZooKeeper能够适用于各种不同的分布式应用场景。

2.2.3 可扩展性

由于客户端是根据通知来触发操作的,而不是通过轮询来检查状态变化,因此系统可以更加高效地利用资源。当分布式系统规模扩大时,ZooKeeper服务端可以通过增加节点来提供更高的处理能力,而客户端的回调处理机制仍然能够保持高效。

2.2.4 可维护性

通过明确的回调处理逻辑,客户端代码更加清晰、易于理解和维护。当系统出现故障或需要调整时,开发人员可以快速地定位问题并采取相应的措施。

2.3 降低网络开销

传统的轮询机制需要客户端不断地向服务端发送请求来查询ZNode的状态是否发生变化。这种方式不仅会增加网络开销,还会增加服务端的处理压力。而ZooKeeper的Watch机制采用了事件驱动的方式,当ZNode状态发生变化时,服务端会主动向客户端发送通知,从而降低了网络开销和服务端的处理压力。

在分布式系统中,传统的轮询机制是一种常见的方式来检查资源或状态的变化。然而,这种方式在涉及到ZooKeeper这样的分布式协调服务时,会显露出一些明显的缺点。具体来说,传统的轮询机制需要客户端不断地向服务端发送请求,以查询ZNode(ZooKeeper中的数据节点)的状态是否发生变化。

这种轮询方式存在几个主要问题:

  1. 网络开销:客户端需要频繁地向服务端发送请求,这会导致网络流量的显著增加。在大型分布式系统中,这种额外的网络流量可能会对网络带宽和稳定性造成压力。
  2. 服务端处理压力:服务端需要不断地处理来自客户端的轮询请求,这会占用大量的服务器资源,增加服务端的处理压力。特别是在高并发的场景下,服务端可能会因为处理过多的轮询请求而陷入瓶颈。
  3. 响应延迟:由于轮询是定期执行的,客户端并不能立即感知到ZNode状态的变化。这种延迟可能会导致客户端在接收到状态变化通知之前继续执行旧的逻辑,从而引发不必要的错误或不一致。

为了解决这些问题,ZooKeeper引入了Watch机制。与轮询机制不同,ZooKeeper的Watch机制采用了事件驱动的方式。具体来说,当客户端对某个ZNode执行了读取操作(如getDatagetChildren等)并设置了Watch时,ZooKeeper服务端会记住这个客户端与ZNode的关联关系。此后,一旦该ZNode的状态发生变化(例如数据内容被修改、子节点被添加或删除、节点本身被删除等),服务端就会主动触发一个事件,并将这个事件通知给所有之前注册了Watch的客户端。

ZooKeeper的Watch机制具有以下优点:

  1. 降低网络开销:由于服务端会在ZNode状态发生变化时主动通知客户端,客户端无需频繁地向服务端发送轮询请求。这大大降低了网络流量,减轻了网络带宽和稳定性的压力。
  2. 减轻服务端处理压力:服务端只需要在ZNode状态发生变化时发送通知,而无需处理大量的轮询请求。这减轻了服务端的处理压力,使其能够更高效地处理其他任务。
  3. 实时性:由于客户端是基于服务端发送的通知来感知ZNode状态变化的,因此客户端能够立即获取到最新的状态信息,并据此执行相应的操作。这种实时性对于需要快速响应的分布式系统来说至关重要。
  4. 灵活性:客户端可以根据实际需求在特定的ZNode上注册Watch,并在接收到通知后执行相应的回调处理函数。这种灵活性使得ZooKeeper能够适应各种不同的分布式应用场景。

03 Watch机制的实现原理

3.1 数据结构

ZooKeeper的Watch机制确实采用了观察者模式(Observer Pattern)来实现。观察者模式是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,它的所有依赖者(观察者)都会自动收到通知并更新。

在ZooKeeper中,这个“主题对象”就是ZNode,而“观察者”则是那些注册了Watch的客户端。ZooKeeper服务端为每个ZNode维护了一个Watch列表,这个列表记录了所有对该ZNode感兴趣并注册了Watch的客户端信息。

当ZNode的状态发生变化时(如数据变更、子节点列表变更、节点被删除等),ZooKeeper服务端会触发相应的事件,并遍历与该ZNode相关联的Watch列表。对于列表中的每个客户端,服务端都会发送一个通知,告知其关注的ZNode的状态已经发生了变化。

值得注意的是,ZooKeeper的Watch机制是一次性的,也就是说,当Watch被触发后,它就会被自动移除,并且客户端需要再次注册新的Watch来继续监听ZNode的状态变化。这种设计是为了避免因为客户端没有及时响应通知而导致服务端持续发送通知,从而造成资源的浪费。

通过采用观察者模式,ZooKeeper的Watch机制实现了对ZNode状态变化的实时感知和通知,使得客户端能够快速地响应ZNode状态的变化,并据此执行相应的操作。这种机制为分布式系统提供了强大的协调功能,使得系统中的各个节点能够协同工作,实现数据的一致性、高可用性和容错性。

3.2 一次性触发

ZooKeeper的Watch机制确实是一次性触发的,这是一个非常重要的特性,需要在使用时特别注意。具体来说,当客户端在ZooKeeper中注册一个Watch以监听某个ZNode的状态变化时,这个Watch只在触发一次之后会被自动移除。换句话说,一旦ZNode的状态发生了变化,服务端会发送通知给所有注册了该ZNode的Watch的客户端,但这些Watch在通知发送完毕后就不会再监听该ZNode的状态了。

这种设计的原因主要有两个:

  1. 避免通知泛滥:如果Watch不是一次性的,那么当ZNode的状态持续变化时,客户端可能会收到大量的通知消息。这不仅会增加客户端的处理负担,还可能导致网络拥堵和服务端性能下降。通过使Watch一次性触发,ZooKeeper能够确保客户端只会在ZNode状态发生变化时收到一次通知,从而避免了通知泛滥的问题。
  2. 简化客户端逻辑:如果客户端需要持续监听ZNode的状态变化,它可以在收到Watch触发的通知后,重新注册一个新的Watch。这种机制使得客户端能够根据自己的需求灵活地控制监听行为,而无需担心因为ZNode状态持续变化而导致的额外开销。

因此,在使用ZooKeeper的Watch机制时,客户端需要注意在收到通知后重新注册Watch,以确保能够持续监听ZNode的状态变化。同时,由于Watch是一次性触发的,客户端还需要注意处理可能存在的状态竞争或数据不一致的情况,以确保分布式系统的一致性和稳定性。

3.3 异步发送通知

ZooKeeper服务端向客户端发送通知时,确实采用了异步的方式进行。这种异步发送通知的方式带来了多个显著的优势,包括提高系统的并发处理能力和响应速度。以下是关于ZooKeeper服务端异步发送通知的详细解释:

3.3.1 异步发送通知
  • 当ZNode的状态发生变化时,ZooKeeper服务端会遍历与该ZNode相关联的Watch列表。
  • 对于列表中的每个客户端,服务端会异步地发送一个通知,告知其关注的ZNode的状态已经发生了变化。
  • 重要的是,服务端不会等待客户端的响应就继续处理其他请求。这种非阻塞的通信方式使得服务端能够高效地处理大量的并发请求。
3.3.2 提高并发处理能力**:
  • 由于服务端采用异步方式发送通知,它不会因为等待客户端的响应而阻塞。因此,服务端能够同时处理多个ZNode的状态变化通知,以及来自其他客户端的读写请求。
  • 这种并发处理能力使得ZooKeeper能够支持高并发的分布式系统,确保系统的高效运行。
3.3.3 提高响应速度
  • 异步发送通知使得客户端能够更快地感知到ZNode的状态变化。一旦服务端检测到ZNode的状态发生变化,它会立即发送通知给客户端,而无需等待其他操作完成。
  • 这种及时的通知机制使得客户端能够迅速作出响应,从而提高了整个系统的响应速度。
3.3.4 顺序保证
  • 虽然通知是异步发送的,但ZooKeeper会提供一个顺序保证:即客户端在看到Watch事件之前,绝不会看到ZNode的实际变化。这确保了不同客户端看到的是一致性的顺序,避免了因为网络延迟或其他因素导致的数据不一致问题。

04 Watch机制的使用场景

4.1 分布式配置管理

在分布式系统中,配置信息的管理和维护是至关重要的一部分。为了确保各个节点能够使用一致的配置信息,这些配置信息通常会被存储在共享存储系统中,如ZooKeeper。ZooKeeper的Watch机制为分布式系统提供了一种高效的方式来监听和响应配置信息的变化。

具体来说,当客户端需要获取配置信息时,它可以从ZooKeeper中读取相应的ZNode数据。为了保持对配置信息变化的敏感,客户端可以在这个ZNode上注册一个Watch。这个Watch可以理解为一个监听器,当ZNode的数据发生变化时,ZooKeeper服务端会异步地向所有注册了该Watch的客户端发送一个通知。

当客户端接收到这个通知后,它知道配置信息已经发生了变化,并可以执行相应的操作来重新加载这些新的配置信息。这个过程通常涉及从ZooKeeper中重新读取ZNode数据,解析配置,并将新的配置应用到本地的业务逻辑中。

4.2 分布式锁

ZooKeeper的Watch机制还可以用于实现分布式锁。具体来说,客户端可以在ZooKeeper中创建一个临时顺序节点作为锁标识。当其他客户端尝试获取锁时,会检查该临时顺序节点是否存在。如果存在,则注册一个Watch到该节点上并等待锁释放;如果不存在,则成功获取锁并执行相应操作。当持有锁的客户端释放锁时(即删除临时顺序节点),ZooKeeper会通知等待队列中的下一个客户端获取锁。这种基于ZooKeeper的分布式锁机制具有高效、可靠和可伸缩性等优点。

4.3 分布式协调

除了上述两个场景外,ZooKeeper的Watch机制还可以用于实现分布式协调。例如,在分布式系统中,多个节点可能需要共同完成某个任务或协作处理某个事件。通过注册Watch到相关ZNode上并监听其状态变化,这些节点可以实时感知到任务或事件的进度和状态变化,并采取相应的处理措施以确保任务或事件的顺利完成。

05 总结

ZooKeeper的Watch机制为分布式系统提供了一种高效、可靠和可伸缩的实时感知节点状态变化的能力。通过注册Watch到相关ZNode上并监听其状态变化,客户端可以实时感知到系统中其他节点的状态变化并采取相应的处理措施以确保系统的协调性和一致性。在实际应用中,我们可以结合具体的业务场景和需求来灵活运用ZooKeeper的Watch机制以提高系统的性能和稳定性。

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

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

相关文章

LeetCode 619, 58, 24

目录 619. 只出现一次的最大数字题目链接表要求知识点思路代码使用where限制:使用having限制: 58. 最后一个单词的长度题目链接标签Java.split()思路代码 不使用Java的API思路代码 24. 两两交换链表中的节点题目链接标签要求思路代码 619. 只出现一次的最…

【blender特效】卡通火焰

核心思想就是通过多个不同缩放尺寸的沃罗诺伊叠加,分别构成火焰的大型,中型和小型(形状),最后通过自发光纹理实现火焰加亮。 用的是ev渲染,完全可以把噪音贴图都烘焙出来,自己改改shader就可以扔…

华为OD刷题C卷 - 每日刷题 29(机器人仓库搬砖,爱吃蟠桃的孙悟空)

1、(机器人仓库搬砖): 这段代码是解决“机器人仓库搬砖”的问题。它提供了一个Java类Main,其中包含main方法和getMinEnergy方法,用于计算机器人每小时充能的最小能量格数,以确保在8小时内搬完所有砖块。 …

C++14 新特性:std::make_unique 和 constexpr

今天介绍的 std::unique_ptr 和 constexpr的用法比较简单,所以放到一篇文章中进行介绍。 1、std::make_unique 首先来看 std::unique_ptr,在 C11 中引入了智能指针和std::unique_ptr,为资源管理提供了更安全、更简洁的手段。但是 C11 缺少了…

STM32无法烧写程序的故障排除

如果你在使用STM32微控制器时遇到无法烧写程序的问题,可以按以下步骤进行故障排除: 1. 确认硬件连接 检查电源:确保STM32板子正确供电。调试器连接:确认ST-LINK调试器或其他编程工具与STM32开发板的连接无误,尤其是S…

jQuery如何实现一个轮播图左右翻页的功能

当使用jQuery来实现一个轮播图左右翻页的功能时&#xff0c;你可以遵循以下步骤&#xff1a; HTML结构&#xff1a;首先&#xff0c;你需要创建一个HTML结构来包含轮播图的图片。 <div class"carousel"> <div class"carousel-images"> <…

利用python爬虫采集苹果公司各产品销售收入统计报告

数据为2013年到2022年苹果公司各产品&#xff08;iPhone、iPad、Mac等&#xff09;及服务的销售收入。iPhone是苹果公司销售收入最高的产品。 数据统计单位为&#xff1a;亿美元 。 数据说明&#xff1a; 数据整理自苹果公司历年10-K文件&#xff0c;每年10-K文件可能对之前年…

DP:两个数组的dp问题

解决两个数组的dp问题的常用状态表示&#xff1a; 1、选取第一个字符串[0-i]区间以及第二个字符串[0,j]区间作为研究对象 2、根据题目的要求确定状态表示 字符串dp的常见技巧 1、空串是有研究意义的&#xff0c;引入空串可以帮助我们思考虚拟的边界如何进行初始化。 2、如…

【odoo】odoo常用的ORM方法

概要 在Odoo中&#xff0c;ORM&#xff08;对象关系映射&#xff0c;Object-Relational Mapping&#xff09;方法是一种将Python对象映射到数据库表的方法。Odoo的ORM系统使开发者能够使用高级的Python代码而不是复杂的SQL语句来操作数据库。Odoo的ORM方法主要用于创建、读取、…

c#数组的使用

前言 我们在开发c#程序的过程中经常需要使用数组&#xff0c;这个数组就是用来存储多个值的一种数据类型。 1、一维数组 1.1 一维数组的声明 int[] array1;//数组的声明 1.2 一维数组的赋值 int[] array2 new int[] { 1, 2, 3, 3 };//数组的赋值 int[] array3 new int[…

云服务器Ubuntu系统的vim-plus(youcompleteme)完整安装

一. 安装vim-plus PS&#xff1a;需要在那个用户下配置vim-plus&#xff0c;就到那个用户下执行代码 git clone https://github.com/chxuan/vimplus.git ~/.vimplus cd ~/.vimplus ./install.sh二. 解决没有代码自动补全的问题 随便创建一个Test.cpp文件&#xff0c;vim打开…

图像生成新篇章:Stable Diffusion 3 Medium开源评析

摘要 在数字艺术与人工智能的交汇点上&#xff0c;Stable Diffusion 3&#xff08;SD3&#xff09;的开源无疑是一场技术革新的盛宴。就在3月份&#xff0c;我撰写了一篇博文&#xff0c;深入探讨了SD3的技术报告内容与介绍&#xff0c;文章发表在CSDN博客上&#xff0c;https:…

如何用多媒体沙盘实现智能交互体验?

随着多媒体技术在内容展示领域的迅猛进步&#xff0c;智能化信息交互方式已然跃升为公众瞩目的焦点&#xff0c;而展厅作为信息传递与产品展示的核心阵地&#xff0c;正面临着提升交互体验、强化信息传递效果的迫切需求。因此&#xff0c;以多媒体沙盘、LED屏幕等创新装置为媒介…

C/C++图形渲染引擎开发方向有钱景吗?

在当前的技术环境下&#xff0c;特别是在图形渲染引擎开发领域&#xff0c;的确存在一些挑战和变化。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私…

Python和OpenCV图像分块之图像边长缩小比率是2

import cv2 import numpy as npimg cv2.imread("F:\\mytupian\\xihuduanqiao.jpg") # 低反光 cv2.imshow(image, img) # # 图像分块 # dst np.zeros(img.shape, img.dtype) ratio 2 #图像边长缩小比率是2&#xff0c;也就是一张图片被分割成四份 height, wi…

证照之星是一款很受欢迎的证件照制作软件

证照之星是一款很受欢迎的证件照制作软件&#xff0c;证照之星可以为用户提供“照片旋转、裁切、调色、背景处理”等功能&#xff0c;满足用户对证件照制作的基本需求。本站证照之星下载专题为大家提供了证照之星电脑版、安卓版、个人免费版等多个版本客户端资源&#xff0c;此…

AI图书推荐:用ChatGPT按需DIY定制来赚钱

《用ChatGPT按需DIY定制来赚钱》ChatGPT Print Money Method &#xff0c;作者是Cindy Donovan 。 下面是图书概要&#xff1a; ### 第一章&#xff1a;什么是按需印刷以及ChatGPT如何使其变得简单易行&#xff1f; 本章介绍了按需印刷的商业模式&#xff0c;即仅在收到订单时…

SpringMVC-基础架构

一、什么是MVC 二、什么是SpringMVC 三、SpringMVC的特点 四、配置SpringMVC 简单流程&#xff1a; 总体框架 1.创建pom.xml依赖 <!--打包方式--><packaging>war</packaging><!--依赖--><dependencies><dependency><groupId>org.s…

使用GPT/文心实现诗词作画

在教育领域中&#xff0c;古诗词一直是培养学生文化素养和审美能力的重要载体。选择合适的古诗词进行学习和欣赏&#xff0c;不仅能够增强他们的语言表达能力&#xff0c;还能促进他们对中国传统文化的理解和热爱。本文将结合AI技术&#xff0c;将古诗词转换为图画。 1、选择适…

602. 好友申请 II :谁有最多的好友

602. 好友申请 II &#xff1a;谁有最多的好友 题目链接&#xff1a;602. 好友申请 II &#xff1a;谁有最多的好友 代码如下&#xff1a; # Write your MySQL query statement below select ids as id,count(*) as num from (select requester_id as idsfrom RequestAccepte…