今日 AI 脑洞

我觉得很快 AI 就可以打破人机交互的界限,这会在软件开发领域发生很大的变化。

May 16, 2024 · GUAN Hao

一次 Debezium 升级记录

最近做了一个 debezium 流水线升级的工作,遇到了挺多问题,记录一下。 事情的起因是最近几个礼拜我们的多个 postgres 实例遇到了磁盘空间不足的问题,看下来并不是我们数据量很大,而是 WAL 日志占据了很大的空间,有些实例 WAL 占用空间是数据的十倍以上,这显然是不正常的情况。即使凭借我浅显的 postgres 知识,我也很快联想到这大概和我们的 debezium 流水线有关。我们的服务的数据写入量并不大,WAL 正常情况下不会占据很大空间,但开启了主从同步,并且延迟很大的话,WAL 就会积攒起来,毕竟总得存着等从库消费完才能删掉,这应该就是我们的问题。 第一个 postgres 实例出现问题的时候,是个很简单的情况:这是个测试实例,之前有 debezium 从这个实例捕捉变动,后来迁走了。但是,我们忘记了删除 replication slot,于是 WAL 从 debezium 停止开始就一直不停积累,终于磁盘不足了。这很好解决,既然迁走不用了,就删掉 replication slot,然后 WAL 就会被自动清理掉,磁盘占用率也就恢复了。 第二个 postgres 实例出现问题的情况就复杂了一些,这正是前面 debezium 流水线后读的数据库,它显然是在不停消费的,那就没道理 WAL 会不停的积累。因为这是测试库,为了不让数据库因为磁盘满而完全不可用,我先停掉了 debezium 服务,然后删除了 replication slot,就和之前的实例一样,磁盘空间被顺利释放出来。之后我重新开启 debezium 观察,可以发现,WAL 确实会以比较快的速度积攒,估计一两天就会撑满磁盘。然而看 debezium 服务,它看起来是正常工作的,输出的 kafka topic 里可以看到有数据。那这就和之前的问题不一样了,并不是不消费才导致的 WAL 积累。 重新搜索了一下,看了 debezium 的文档,原来这个问题是有详细解释的。简单来说就是,并不是不消费,而是需要同步的库流量太少,而 WAL 是针对整个实例而言的,如果其他库写入量很大,产生的 WAL 就很大,但是需要同步的库很久没有变动,debezium 也就没法记录下来,这样就会导致 WAL 积累。解决的办法文档里也提了,需要用心跳机制来保证 WAL 有变动,这样就不会积累了。那就需要配置 heartbeat.interval.ms 和 heartbeat.action.query 两个参数,前一个是心跳包发送间隔,每次心跳会往 sink 里写一条消息。后一个可以配置一条 SQL,内容是随便的一些写入操作即可,比如更新任意表的一条记录,只要保证他能触发 replication 点的更新即可。于是我就配了这俩,但是……看起来不生效。...

December 17, 2022 · GUAN Hao

第一次当面试官

几周前我第一次作为面试官,对一位投了我们实习生职位的同学进行了电话面试,结果是这位同学被我拒了。也算是我第一次当面试官,写点字记录一下。 某周五收到经理一封邮件,叫我联系一位同学进行电话面试,同时邮件里附上了简历。并且经理又告诉我,如果这位同学入选了,最后会安排来帮我的忙。所以我对这场面 试还是很重视,也是很期待的。 首先是看简历,乍一看排版比较简单,于是不敢怠慢,因为据说牛人的简历常常排版很简单。再看内容——希望国某排名不靠前但也算出名的大学本科 CS Major 在读,嗯,学历上没有问题。海外求学经历略有加分,只可惜不是牛校。再看技能,Java 和 Python 精通,嗯,正好是我现在用的最多的两种语言,加分。其他么,当然少不了人人都(以为自己)会的 HTML, JavaScript, CSS……最后还有 MATLAB。然后看学的课,该学的基础课都学了,貌似还特别喜欢图像处理。项目经历里也有一 个 HDR 图像生成的项目。嗯,这么看来面试应该有得聊,他一定想不到当年我本科 FYP 也是搞的图像处理。 于是开始准备面试题,从经理那边要来一份题库,看了下,大部分我也不会:-( 只好慢慢挑,找了几条挺基础的题目。代码题找了两条,都是挺简单的。最后又准备了一道 当年我去 Google 面试的时候被问到的题目,算是智力题吧,如果答上来也能当代码题做(不过我那次没有被叫写代码)。嗯,题目准备的差不多,我再把客套题也准备了下,比如自我介绍啊,介绍自己做的项目啥的,都想了一下要怎么问,我这准备也算是充分了。 周一早上约了个下午面试,下午我准时打了电话过去,面试顺利开始,这都没啥好说的。 客套了下,叫自我介绍,再介绍一下项目经历,实习生嘛,项目经历也没太多可聊,于是就直接开始问问题了。 先问了个 OO 的概念多态,嗯,反应不快……想了会儿还是基本能答上来。 再问了个 Singleton,呃,不知道,想了一会儿能说个大概,但是不知道怎么实现。 再问问进程和线程的区别,这个就说不大清楚了,除了一个进程能有多个线程外,好像其他就都不知道了。 再问进程间常用的通讯方式有哪些,这个就……也啥都不知道了。 也许没上过 OS 课?他又说上过……好吧,也许你们学校教的比较简单吧。 没关系,会写代码就行,反正招来也就是写代码的~ 折腾了半天,打开了 collabedit.com,一个协作工具。 于是第一题 方法输入一个字符串,里面包含一些空格分隔的单词,将这些单词逆序排列,并仍旧以空格连接成字符串输出。 提示了可以随便用啥语言,随便用什么库。输入里没有奇怪的东西,不用考虑异常和边界。 既然 Python 精通,我想这题目可以用 Python 快速搞定,本来这题的目的也是热身。不说写个 Python One-Liner,写个 Loop 也就几行的事。可是,这位同学选择了用 Java……那也行,没啥不好,Java 也就稍微多几行嘛。结果后面就开始磨蹭了:先是声明个数组存单词,可是又不知道单词有多少个,倒是知道数组长度不能变,于是怎么办?不知道有 List…… 这下好,想了半天,真机智,先数一下有多少个空格,再声明数组吧…… 于是继续写,呃,好像又搞不定,数完 空格,不知道怎么把词搞到数组里去……好吧,再提示一下,别折腾了,可以用 String.split 啊!于是擦掉,改用 split,得到了一个数组,可是怎么把它倒过来呢?啊,有个数据结构叫 Stack,FILO,嗯,就用它!少年你怎么能如此机智……把一个数组倒过来输出,需要用一个 Stack 吗?Anyway,最后得到了一个逆 序的数组,可是不知道怎么拼成字符串,算了就这么输出吧。这段代码写了有20分钟吧…… 于是第二题……也就可以不用写了。本来我是准备了一个求二叉树高度的题目,也没啥难度,递归的话就几行。 嗯,这样子不开心,不如再问个题,于是把 Google 的智力题问了,想了一会儿,这题目倒是能想出来怎么做,当然代码就不写了吧。 后面又客套了几句,什么你有啥要问我的之类,后来我也记不清自己说了啥就拜拜了~ 终于完了,我跟经理说,这人不行。经理说你要求太高,我说字符串单词逆序不会写…… 这下经理没话说了。当晚回去后我还纠结了好一阵,也算是我第一次面别人,把人拒了会不会不好。甚至想到晚上睡得都不踏实,总觉得据了别人挺不好的,是不是我真的要求太高了?我事先没说面试要考写代码,会不会不公平?他是不是紧张 了?...

June 20, 2014 · GUAN Hao