自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

water Wang

每个人都会有觉醒期,只是来的晚或者早罢了。

  • 博客(100)
  • 资源 (15)
  • 论坛 (1)
  • 收藏
  • 关注

原创 docker(13):底层实现

1.基本架构Docker 采用了 C/S架构,包括客户端和服务端。 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者 RESTfulAPI 来进行通信。Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。2.名字空间名字空间是 Linux .

2021-04-29 21:21:13 22 1

原创 docker(12):Dockerfile

1.基本结构Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。例如#This dockerfile uses the ubuntu image#VERSION 2 - EDITION 1#Author: docker_user#Command format: Instruction [arguments / command] ..#Base image to use,

2021-04-29 17:42:07 20 1

原创 docker(11):安全

1.内核名字空间Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。当用 docker run 启动一个容器时,在后台 Docker 为容器创建了一个独立的名字空间和控制组集合。名字空间提供了最基础也是最直接的隔离,在容器中运行的进程不会被运行在主机上的进程和其它容器发现和作用。每个容器都有自己独有的网络栈,意味着它们不能访问其他容器的 sockets 或接口。不过,如果主机系统上做了相应的设置,容器可以像跟主机交互一样的和其他容器交互。当指定公共端口或使用 links 来连接 2 个

2021-04-29 17:15:44 23

原创 docker(10):实战案例

1.使用 Supervisor 来管理进程Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。本小节将使用进程管理工具 supervisor 来管理容器中的多个进程。使用 Supervisor 可以更好的控制、管理、重启我们希望运行的进程。在这里我们演示一下如何同时使用 ssh 和 ap

2021-04-29 13:41:22 88

原创 docker(9):高级网络配置

1. 快速配置指南当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 (http://tools.ietf.org/html/rfc1918) 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1 ,掩码为 255.255.0.0 。此后启动的容器内的网口也会自动分配一个同

2021-04-29 07:59:26 32

原创 docker(8):使用网络

1. 外部访问容器容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。使用 docker ps 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。$ sudo docker run -d -P training/webapp python app.py$

2021-04-28 23:16:56 21

原创 docker(7):数据管理

1. 数据卷数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:数据卷可以在容器之间共享和重用对数据卷的修改会立马生效对数据卷的更新,不会影响镜像卷会一直存在,直到没有容器使用 *数据卷的使用,类似于 Linux 下对目录或文件进行 mount。1.1 创建一个数据卷在用 docker run 命令的时候,使用 -v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。下面创建一个 web 容器,并加载一个数据卷到容器的

2021-04-28 22:36:35 20

原创 docker(6):仓库

1. Docker Hub仓库(Repository)是集中存放镜像的地方。一个容易混淆的概念是注册服务器(Registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 dl.dockerpool.com/ubuntu 来说, dl.dockerpool.com 是注册服务器地址, ubuntu 是仓库名。大部分时候,并不需要严格区分这两者的概念。目前 Docker 官方维护

2021-04-28 21:21:42 15

原创 docker(5):容器

1. 启动容器是 Docker 又一核心概念。简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。本章将具体介绍如何来管理一个容器,包括创建、启动和停止等。 启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。1.1 新建并启动所需要的命令主要为 d

2021-04-28 16:44:15 26

原创 docker(4):镜像

1. 获取镜像在之前的介绍中,我们知道镜像是 Docker 的三大组件之一。Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库)。本章将介绍更多关于镜像的内容,包括:从仓库获取镜像;管理本地主机上的镜像;介绍镜像实现的基本原理。可以使用 docker pull 命令来从仓库获取所需要的镜像。下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像。

2021-04-27 22:52:37 29

原创 docker(3): 安装

1. Ubuntu 系列安装 Docker官方网站上有各种环境下的 安装指南 (https://docs.docker.com/installation/#installation) 。1.1 通过系统自带包安装Ubuntu 14.04 版本系统中已经自带了 Docker 包,可以直接安装。$ sudo apt-get update$ sudo apt-get install -y docker.io$ sudo ln -sf /usr/bin/docker.io /usr/local/bin

2021-04-27 22:09:24 22

原创 docker(2):基本概念

1. 镜像Docker 包括三个基本概念镜像(Image)容器(Container)仓库(Repository)理解了这三个概念,就理解了 Docker 的整个生命周期。1.1 Docker 镜像Docker 镜像就是一个只读的模板。例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一

2021-04-27 20:46:24 25

原创 docker(1):什么是 Docker

1. 什么是dockerDocker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会,遵从了Apache2.0协议,项目代码在GitHub(https://github.com/docker/docker)上进行维护。Docker自开源后受到广泛的关注和讨论,以至于dotCloud公司后来都改名为DockerInc。Redhat已经在其RHEL6.5中集中支持Docker;Google也在其PaaS

2021-04-27 19:51:47 40

原创 redis实战(12):Redis性能监控指标汇总

1. 添加依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository

2021-04-26 21:06:17 40 4

原创 6.3.3 延迟缓存

副本管理器针对生产请求和l拉取请求都有一个全局的延迟缓存,生产请求对应延迟缓存中存储了延迟的生产(DelayedProduce),拉取请求对应延迟缓存中存储了延迟的拉取(DelayedFetch)。Kafka的延迟缓存数据结构(DelayedOperatlonPurgatory)和上一节的Purgatory类似。下面的代码片段以延迟的生产和拉取为例,列举了副本管理器中,与延迟缓存、延迟操作相关的方法:延迟缓存除了管理延迟操作,还要从分区角度尝试完成延迟的操作,延迟缓存主要有下面两个方法。tryCom

2021-04-23 21:15:21 44 2

原创 6.3.2 延迟操作与延迟缓存

客户端的一个请求包括多个分区,服务端为每个请求都会创建一个延迟操作对象,而不是为每个分区创建一个延迟操作对象。服务端的“延迟操作缓存”管理了所有的“延迟操作对象”,缓存的键是每一个分区,缓存的值是分区对应的延迟操作列表。分区与延迟操作的映射关系如图6-56所示,假设第一个延迟操作包含的分区有[Pl,P2,P3,P4,P5],第二个延迟操作包含的分区有[Pl,P3,P5,P6,P7]。在延迟缓存中,从分区的角度来看,分区Pl上有两个延迟的操作,分区P2上只有一个延迟的操作,分区P3上有两个延迟的操作.

2021-04-23 13:52:43 18

原创 6.3.1 延迟操作接口

6.3 延迟操作Kafka的服务端处理客户端的请求,针对不同的请求,可能不会立即返回响应结果给客户端。比如,生产者设置的应答值等于-I,服务端必须等待ISR所有副本都同步完消息,才会发送生产结果给生产者。消费者或备份副本设置的最小拉取大小等于l字节,服务端必须至少读取到l字节的消息,才会发送拉取结果给消费者或备份副本。Kafka在处理这种类型的请求时,会将“延迟返回响应结果的请求”即“延迟操作”对象(DelayedOperation)放入“延迟缓存队列”(DelayedOperationPurgat

2021-04-23 10:35:27 33

原创 6.2.2 分区与副本

6.2.2分区与副本本章最开始分析底层的消息集时,主要专注物理层面的日志、日志分段、日志管理器,并没有过多考虑什么时候通过日志管理器去调用日志对象的相关方法。然后,在分析副本管理器时,我们知道日志管理器在启动时会作为副本管理器的成员变量。但是,富lj本管理器并不负责创建日志,它只是管理消息代理节点上的分区。所以,副本管理器将日志管理器这个全局的成员变量,传给了它所管理的每个分区。副本管理器的每个分区会通过日志管理器,为每个副本创建对应的日志。如表6-7所示,“日志管理器”对“日志”进行管理,“副本管

2021-04-22 21:27:25 30

原创 6.2.1 副本管理器

如图6-42所示,上一节将日志作为人- ,分析了日志的读写,但并没有分析日志相关的上下文。本节会从服务端的人- 出发,通过副本管理器、分区、副本,一直到日志,将整个读写流程串联起来。图中分区到日志的虚线表示:业务逻辑层的一个分区对应物理存储层的一个日志。消息集到数据文件的虚线表示:客户端发送的消息集最终会写入日志分段对应的数据文件,存储至UKafka的消息、代理节点。Kafka服务在启动时会先创建各种相关的组件,最后才会创建KafkaApi.s。业务组件一般都有后台的线程,除了创建组件后,也要启动这些后

2021-04-22 14:29:42 23

原创 6.1.6 日志压缩

不管是传统的RDBMS还是分布式的NoSQL,存储在数据库中的数据总会更新。更新数据有两种方式:直接更新(找到数据库中的已有位置,以最新的值替换旧的值)、以追加方式更新(保留旧值,查询时再合并;或者会有一个后台线程,对相同键的所有记录进行定期合并操作)。第二种做法因为在写操作时不需要查询,所以写性能会很高。如表6-3所示,很多分布式存储系统都采用这种追加方式。这种方式的缺点是:需要通过后台的压缩操作保证相同键的多条记录,经过合并后只保留最新的一条记录。如图6-35所示,Kafka的消息由键值组成,在.

2021-04-22 11:59:50 25 2

原创 6.1.5 日志管理

Kafka的日志管理负责日志的创建、检索、清理,但和日志相关的读写操作则交给日志实例去处理。每个逻辑意义的分区都对应一个物理意义的日志实例,日志管理类用logs管理了分区对应的日志实例。相关代码如下:Kafka消息代理节点的数据目录配置项(log.di.rs)可以设置多个目录。如图6-31(左)所示,代理节点的log.di.rs=/t1’1p/kafka_logs1,/tl’lp/kafka_logs2,表示它有两个数据目录。代理节点负责的所有分区分别分布在这两个目录巾,第一个数据目录下有[test.

2021-04-21 22:45:21 25

原创 6.1.4 读取日志

Kafka中分区的主副本负责消息集的读写操作,消费者或者备份副本都会向主副本同步数据。客户端读取主副本的过程又叫作“拉取”,拉取主副本的消息集,一定会指定拉取偏移量。比如,前面章节中消费者会根据提交偏移盘,或者客户端设置的重置策略从指定的拉取位置(startOffset)开始拉取消息。服务端处理客户端的拉取请求,就会返回从这个位置开始读取的消息集。另外,客户端还会指定拉取的数据量(fetchSize),这个值默认是Max.partition.fetch.bytes配置项,大小为lMB。注意:客户均拉取.

2021-04-21 21:44:17 30

原创 6.1.3 日志分段

6.1.3 日志分段服务端处理每批追加到日志分段中的消息集,都是以nextOffsetMetadata作为起始的绝对偏移盘。因为这个起始偏移量总是递增的,所以每一批消息的偏移量也一直保持递增。我们可以得州的结论是:同一个分区的所有日志分段中,所有消息的偏移量都是递增的。如图6-11所示,上面的箭头从全局的日志分段角度看,下面每个日志分段中的箭头则只从当前的日志分段看,有下面的两个特点:新创建日志分段的基准偏移盐,都比之前分段的基准偏移量要大;同一个日志分段中,新消息的偏移量也比之前消息的偏移盘要

2021-04-21 20:38:37 24

原创 6.1.2 写入日志

6.1.2 写入日志服务端将生产者产生的消息集存储到日志文件,要考虑对消息集进行分段存储。如图6-3所示,服务端将消息追加到日志变件,并不是直接写入底层的文件,具体步骤如下。(1)每个分区对应的日志对象管理了分区的所有日志分段。(2)将消息集迫加到当前活动的日志分段,任何时刻,都只会有一个活动的日志分段。(3)每个日志分段对应一个数据文件和索引文件,消息内容会追加到数据文件中。(4)操作底层数据的接口是文件通道,消息集提供一个WriteFullyTo()方法,参数是文件通道。(5)消息集(B

2021-04-21 19:46:08 28

原创 6.1.1 分区、副本、日志、日志分段

Kafka是一个分布式的(distributed)、分区的(partitioned)、复制的(replicated)提交日志(commitlog)服务。“分布式”是所有分布式系统的特性;“分区”指消息会按照分区分布在集群的所有节点上;“复制”指每个分区都会有多个剧本存储在不同的节点上;“提交日志”指新的消息总是以追加的方式进行存储。注意:“分区”可以做到线性扩展和负载均衡,“复制”可以做到故障容错,而“提交日志”是一种存储方式。Kafka的这几个特性在大多数分布式系统中都很常见,比如HDFS分布式文件系

2021-04-21 16:51:29 18

原创 5.4.7 延迟的心跳

5.4.7 延迟的心跳延迟操作有3个主要的方法:尝试完成方法(返回布尔值,表示是有可以完成)、超时的回调方法、完成的回调方法。对于“延迟加入”,尝试完成是判断消费组成员中是否还有消费者没有重新发送“加入组请求”,如果全部都发送了“加入组请求”,就认为“延迟加入”可以完成。“延迟加入”完成时的回调方法会发送“加入组响应”。“延迟心跳”的尝试完成方法(tryCompleteHeartbeat())判断条件是:消费者成员是否存活。如果消费者存活,则可以调用完成时的回调方法(onCompleteHeart.

2021-04-21 16:02:58 20

原创 5.3.5 消费组未稳定,原有消费者重新加入消费组

5.3.5 消费组未稳定,原有消费者重新加入消费组再来看另一种场景:其他消费者发送“加入组请求”先于第一个消费者发送“同步组请求”。协调者返回“加入组响应”给第一个消费者,并更改消费组状态为“等待同步”。第一个消费者收到“加入组响应”后,但还没完成分区分配的工作,就有新的消费者发送了“加入组请求”。这时候其实第一个消费者是不需要执行分区分配的,因为即使执行了,也只有它一个的,并不会包含新加入的第二个消费者。如图5-10(上)所示,第一个消费者完成分区分配工作后,“同步组请求”的消费组分配结果只有第一

2021-04-21 13:09:53 12

原创 5.3.4 消费组稳定后,原有消费者重新加入消费组

5.3.4 消费组稳定后,原有消费者重新加入消费组协调者在处理消费者发送的“加入组请求”和“同步组请求”时,都会依赖于消费组当前的状态进入不同的分支流程。假设第一个消费者完成一次再平衡操作后,又有新的消费者发送了“加入组请求”。如图5-9所示,新消费者会发起新的再平衡操作,原有的消费者也需要重新发送“加入组请求”,具体步骤如下。(1)(图5-9(左))第一个消费者发送“加入组请求”,也完成了延迟操作,会将它的回调方法重置为空。(2)(图5-9(中))协调者处理第二个消费者的“加入组请求”,消费组状

2021-04-21 10:24:25 10

原创 5.3.2 延迟操作和延迟缓存

5.3.2 延迟操作和延迟缓存Kafka服务端在处理客户端的一些请求时,如果不能及时返回响应结果给客户端,会在服务端创建一个延迟操作对象(DelayedOperatlon),并放在延迟缓存中(DelayedOperati.onPurgatory)。Kafka的延迟操作有多种:延迟的生产、延迟的响应、延迟的加入、延迟的心跳。关于延迟操作和延迟缓存相关的流程,会在下一章详细分析,这里先给出一些延迟操作相关的结论。延迟操作需要指定一个超时时间,表示在指定时间内没有完成时会被强制完成。延迟操作加入到延.

2021-04-21 07:59:12 11

原创 5.3.3 尝试完成延迟的加入操作

5.3.3 尝试完成延迟的加入操作协调者在创建完延迟操作对象之后,为了检查能否完成刚刚创建的延迟操作,会调用延迟缓存的tryCompleteElseWatch()方法立即尝试完成。延迟缓存会调用延迟操作的tryComplete()方法,对于加入组的延迟缓存,就是调用延迟加入对象的tryCompleteJoi.n()方法。这个方法的第二个参数表示如果可以完成,就会强制完成延迟加入对象,RP最终会调用到延迟加入对象的onCompleteJoi.n()方法。延迟加入操作对象的tryComplete()方法和o

2021-04-21 00:54:54 19 2

原创 5.2.4 协调者调用回调方法发送晌应给客户端

5.2.4 协调者调用回调方法发送晌应给客户端在5.2.2节,消费者成员元数据定义了两个值对象:awaitingJo1nCallback和awaitingSyncCallback。我们也分析了把值对象当作方法调用时,实际上会调用KafkaApis中事先定义的“发送响应的回调方法”,说明协调者处理完请求,发送“响应结果”给客户端。注意:下面的方法会涉及“消费组的状态”,但都只会粗略地一笔带过,后面会详细分析状态机的实现。发送“加入组响应”给消费者协调者要返回“加入组响应”给消费组下的所有消费.

2021-04-20 23:19:07 12

原创 5.2.3 协调者处理请求前的条件检查

5.2.3 协调者处理请求前的条件检查协调者在处理“加入组请求”和“同步组请求”之前都需要优先做下吨的一些条件检查。协调者不可用,通常是协调者被关闭了。消费者客户端传递的消费组编号无效,比如没有设置消费组编号。消费者连接错了协调者,这个协调者不是消费组的协调者。协调者正在加载,通常是协调者自身在进行迁移。消费者客户端设置的会话超时时间无效。协调者还没有消费组,但消费者的成员编号却不是“未知编号”。协调者有消费组,消费者的成员编号不是“未知编号”,但是不在消费组中。协调者针对上面几种异常

2021-04-20 21:09:04 15

原创 5.2.2 消费者和消费组元数据

5.2.2 消费者和消费组元数据消费者加入组过程发送的“加入组请求”和“同步组请求”,都会指定消费组编号(groupid)和消费者成员编号(l’lel’lberId),同一个消费组编号只对应一个“消费组元数据”(GroupMetadata,下文简称“组元数据”)。服务端使用“消费者成员元数据”(Mel’lberMetadata,下文简称“成员元数据”)表示每个泊费者发送的元数据信息,并添加到对应的“组元数据”中。注意:协调者处理“加入组请求”和“同步组请求”,不需妥为每种请求都定义一个“成员元数据.

2021-04-20 19:50:10 12

原创 5.1.4 加入组的准备、完成和监昕器

5.1.4 加入组的准备、完成和监昕器消费者重新加入消费组,在分配到分区的前后,都会对消费者的拉取工作产生影响。消费者发送“加入组请求”之前要停止拉取消息,在收到“加入组响应”中的分区之后要重新开始拉取消息。同时,为了能够让客户端应用程序感知消费者管理的分区发生变化,在加入组前后,客户端还可以设置自定义的“消费者再平衡监听器”,以便对分区的变化做出合适的处理。准备和完成“加入组请求”消费者发送“加入每请求”给协调者,最终从协调者获取到的分配结果对象(Ass"ignment)表示分配给消费者的.

2021-04-20 19:09:31 35

原创 5.1.3 主消费者执行分配任务

5.1.3 主消费者执行分配任务消费者发送的“加入组请求”(Jo1nGroupRequest)的内容包括:消费组编号、消费者成员编号、协议类型、协议内容和元数据(protocolMetadata)。其中,协议内容是分区分配算法的名称,元数据是消费者订阅的主题列表。“加入组响应”对象的内容包括:消费者成员编号、统一的消费组协议、主消费者编号、协调者执行分区分配工作的次数、消费者成员列表。客户端发送的协议与服务端返回的“消费组协议”(groupProtocol)。虽然“加入组请求”中的“协议名称”包括

2021-04-20 15:56:10 9

原创 5.1.2 消费者的加入组和同步组

5.1.2 消费者的加入组和同步组消费者向协调者发送“加入组请求”获取分区和现实生活中的任务分配很相似。为了帮助理解分区分配的过程,我们以软件开发常见的任务分士为例如图5-1所示。公司要开发一个新项目,有3个开发人员向项目经理申请开发任务;项目经理执行任务分配,将项目的3个模块分别交给3个开发人员。这个示例中开发人员是消费者,项目经理是协调者,项目有哪些模块是集群的元数据,项目经理分配任务是分区分配算法,项目经理将不同模块分给不同的开发人员等价于不同分区分配给不同消费者。将这个示例对应到消费者分区分配的

2021-04-20 13:35:17 15

原创 4.4.4 消费者的消息处理语义

4.4.4 消费者的消息处理语义消费者从消息代理节点拉取到分区的消息后,对一条消息的处理语义有下面3种情况。至多一次。消息最多被处理一次,可能会丢失,但绝不会重复传输。至少一次。消息至少被处理一次,不可能丢失,但可能会重复传输。正好一次。消息正好被处理一次,不可能丢失,也不可能重复传输。消费者重新加入消费组会分配到新的分区,为了保证消费者能从分配分区的最近提交位置重新开始拉取井消费消息,消费者可以通过手动方式或定时任务提交分区的偏移量,保存分区的消费进度。消费者处理消息并更新消费进度,有下面.

2021-04-20 11:49:04 23

原创 4.3.5 心跳和协调者的关系

4.3.5 心跳和协调者的关系客户端调用心跳任务的reset()方法会创建第一个延迟任务,这个方法的调用链如下。确保协调者是已知的,即消费者客户端必须连接上管理消费组的协调者。确保消费组是活动的,即消费者必须分配到分区。注意:上面两个调用的方法都定义在对应的请求回调处理器中,前者是“获取消费组的协调者”请求(GroupCoordi.natorRequest),后者是“加入消费组”请求(Joi.叫roupRequest)。消费者和协调者进行交互操作,必须确保消费者已经知道并且连接上协调者所在的节点

2021-04-20 09:28:42 11

原创 4.4.3 同步提交偏移量

4.4.3 同步提交偏移量消费者同步提交偏移盐的做法,和4.2.2节第3小节“组合模式的运用:获取偏移量”中的获取偏移盘处理方式类似,都是在最外层用一个死循环来确保必须收到服务端返回的响应结果才能结束。自动提交任务使用异步模式提交偏移量,调用cHent.qutckPoll()后,可以立即回到主线程,所以异步模式是无阻塞的。而同步模式提交偏移量,调用者必须等到提交偏移量完成后才回到主线程,所以同步模式是阻塞的。相关代码如下:自动提交任务使用异步方式提交偏移量,因为任务是周期性运行的,没有什么依赖条件,不

2021-04-20 00:10:45 22

原创 4.3.4 处理心跳结果的示例

4.3.4 处理心跳结果的示例如图4-34所示,客户端启动时会创建调度时间为0秒的延迟任务加入队列。客户端轮询的时间为2秒,会弹出延迟任务(因为延迟任务的调度时间小于当前时间),现在队列为空了。但是因为没有上一次心跳,只有上一次的会话重置时间,经过下面3个步骤的计算后,会重新创建一个调度时间为5秒的延迟任务加入队列。(1)距离上次心跳的时间间隔=当前轮询的时间-上次会话的重置时间=2秒一0秒=2秒。(2)距离下次心跳的时间间隔=心跳间隔距离上次心跳的时间间隔=5秒-2秒=3秒。(3)下次心跳任务的.

2021-04-19 23:22:04 11

JVM脑图-必须名称要十个字

JVM脑图

2021-03-11

kingbase8-8.2.0.jar

kingbase8-8.2.0.jar,是链接人大金仓数据库的jar文件

2021-01-13

java-pdf.rar

java-pdf.rar

2021-03-11

redis-PDF.rar

redis-PDF.rar

2021-03-11

ePass1000ND 开发包.rar

对ukey中双向认证的key进行正删查,ukey插上电脑后自动识别ukey中的证书

2020-10-14

https双向认证ukey管理软件

https双向认证ukey管理软件

2020-10-14

mysql-5.5.20-winx64

mysql-5.5.20-winx64

2016-09-01

mysql_5.6.24_winx64

mysql_5.6.24_winx64

2016-09-01

测试驱动开发(中文完整版-带书签)

测试驱动开发(中文完整版-带书签)

2016-08-30

clean_code(中文完整版)

clean_code(中文完整版)

2016-08-26

单元测试之道Java版:使用JUnit

单元测试之道Java版:使用JUnit

2016-08-30

Pragmatic Unit Testing

Pragmatic Unit Testing

2016-08-30

navicat for mysql破解版

先安装navicat,然后执行patch navicat指向navicat.exe

2016-07-25

sqlyog10绿色版

sqlyog10绿色版

2016-07-25

Navicat for MySQL绿色版

Navicat for MySQL绿色版

2016-09-01

water___Wang的留言板

发表于 2020-01-02 最后回复 2020-01-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除