Skip to content

Latest commit

 

History

History
138 lines (94 loc) · 7.77 KB

HOWTOCODE.md

File metadata and controls

138 lines (94 loc) · 7.77 KB

目录

一、架构设计

1、基于Canal

Canal提供了数据库增量订阅与消费的功能,不需要业务代码的侵入和依赖,通过读取MQ,即可获取到数据库的增量更新

2、ES文档更新

对于数据源为数据库(如MySQL)的ES文档更新,主要有全量更新和增量更新两种方案

  • 全量更新 :脚本全量查询数据库,统一写入至ES中

  • 增量更新 :双写或读取binlog,实现ES的增量更新

ESUpdater就是读取binlog,实现ES文档增量更新的一种解决方案

3、完整架构

ESUpdater提供了从消费Kafka中的数据库增量数据,到ES文档增量更新的一个完整业务框架,方便业务的扩展。

  • Consumer 进程 :订阅Kafka队列,实时获取数据库的增量变更
  • Worker 进程 :操作业务逻辑,将数据更新至ES文档

二、底层原理

ESUpdater的核心由Consumer进程和Worker进程组成,其中根目录下的/esupdater.php为入口文件

1、生命周期

Consumer进程和Worker进程的生命周期都是由命令控制

(1) Consumer

Consumer进程由php esupdater.php start命令启动,由php esupdater.php stop命令停止

(2) Worker

Consumer进程从Kafka中拿到消息后,会通过exec的方式执行php esupdater work命令,以启动一个新的PHP进程,即Worker进程。

Worker进程会分为后台和非后台两种执行方式,使用哪种执行方式取决于当前Worker进程的数量,如果少于配置的max_worker_count会使用后台执行的方式,否则使用非后台执行的方式。通过这种方式可以在加快消费速度的同时,保证稳定性。

所以Worker进程的启动完全由Consumer控制,如果想要停止Worker进程,必须先停止Consumer进程,然后等待Worker进程正常执行结束即可

2、命令执行

(1) start

当使用php esupdater.php start命令时,会启动一个进程,这个进程会以阻塞主进程的方式订阅Kafka消息,所以这个进程叫做Consumer进程

Consumer进程启动后会先在/runtime目录下写/runtime/esupdater-consumer.pid文件和esupdater-consumer.status文件,分别记录进程它的进程ID和消费状态start

Consumer进程消费kafka消息的同时,会每隔配置的check_status_interval_seconds时间检测一次消费状态(esupdater-consumer.status文件),当消费状态变为stop时,进程会停止消费,此时Consumer进程会完全结束。

(2) stop

当使用php esupdater.php stop命令时,会启动一个进程,这个进程会向/runtime/esupdater-consumer.status文件中写入stop指定。

然后每隔一秒钟就会检测Consumer进程和Worker进程是否都已经完全结束,如果已经检测10秒钟还未完全结束就会通知停止失败,否则停止成功。

(3) work

Consumer进程使用php esupdater work命令启动Worker进程时,Worker进程会记录下/runtime/esupdater-worker-{pid}.pid进程ID文件,只有当结束后才会删除此文件。

3、binlog数据处理过程

处理过程为binlog => canalData => urlencode(canalData),可以参考文件 /framework/Canal.php

  1. Canal将binlog数据解析为json格式并投递至kafka
  2. Consumer进程消费kafka,使用urlencode方式编码获取到的消息数据
  3. Consumer进程把编码后的消息数据,传递至Worker进程
  4. Worker进程再依次拆解数据即可

4、文件目录规范

(1) 目录结构

  • app目录 :应用目录
  • config目录 :项目的唯一配置入口
  • doc目录 :项目文档目录
  • framework目录 :项目的核心框架目录
  • install目录 :安装目录
  • runtime目录 :服务运行时产生的中间文件目录,如PID文件,但不包括日志文件。设计思想基于/proc/
  • test目录 :单元测试目录
  • /目录 :根目录下存放所有上述目录,和必要的一级文件如.gitignore文件

(2) 文件规范

  • shell脚本不能省略.sh后缀,且统一以bash xxx.sh的方式执行
  • 文档统一以大写英文命名,如README.md / HELP.md

5、程序设计规范

关于设计规范可以参考文章 漫谈编程之编程规范

  • 调用类的时候使用命名空间前缀,不使用在头部声明use的方式

三、部署过程

容器化部署方案依赖于phpkafka镜像,所以请确保phpkafka镜像已经生成。为了避免重复构建耗时,建议把phpkafka镜像推到Docker远程仓库中。

容器构建主要通过根目录下的/Dockerfile镜像文件,它会基于phpkafka镜像构建一个新的镜像,名为esupdater

1、启动

当执行如下命令时,会使用/Dockerfile文件创建esupdater镜像,并创建esupdaterContainer容器,最后通过在容器中执行php esupdater.php start命令实现服务的启动

bash ./start.sh

启动成功后,除命令行输出Start success外,在宿主机/home/log/esupdater/info.log.{date}日志中会输出启动日志,如下图所示

img

2、停止

当执行以下命令时,会先在容器中执行php esupdater.php stop命令,等待容器内Consumer进程和Worker进程全部停止后,删除镜像和容器

bash ./stop.sh

停止成功后,除命令行输出Stop success外,同样的在宿主机/home/log/esupdater/info.log.{date}日志中会输出停止成功日志,如下图所示

img

3、重启

当执行以下命令时,会先执行bash stop.sh命令,再执行bash start.sh命令,以防止出现重复启动的问题

bash ./restart.sh

四、参考文档