Yukang's Page

Kong的0.11.0版本

2017-09-12

Kong发布了新的版本0.11.0,从这里开始区分了社区版本和商业版。这次改动比较大的是丢弃了serf,这样整个Kong节点之间的缓存同步方式变化了。开发者给出的理由如下:

  1. 依赖serf,serf并不属于Nginx/OpenResty
  2. 这种依赖相互间通信来同步的机制对于deployment和容器化都有些不便
  3. 在运行的Kong节点触发serf需要一些租塞的I/O

新的实现的思路是以数据库作为中心,增加一个cluster events的表。任何Kong node都可以向数据库发送变更消息,其他节点polling数据库改动,然后来更新缓存内容。这个改动非常大,不过最终Kong终于实现了节点无状态,之前那个数据库里的nodes可以丢弃掉了,任何时候节点重启只要连上数据库即可工作。我们需要担心的是这么多节点去polling数据库(当然这些动作都是在后台),是否是一个比较耗时的工作。

Kong增加了新的配置选项db_update_frequency,默认为5s,表示多长时间polling一次,这需要用户自己权衡效率和及时性了。对于我们的业务来说及时性还是很重要的,比如我们新品发布时间精确到秒,那么我们就需要尽量调低这个参数。

所有的改动在https://github.com/Mashape/kong/pull/2561/files,

我大概看了一下代码,一些值得注意的地方如下:

  1. cluster相关的API和cmd都被移掉了,启动部分和serf信号处理部分都删掉了不少代码。
  2. polling需要避免一个问题,比如上一次polling还未执行完成,下一次polling就不应该启动,所以这里需要锁来处理。kong/cluster_events.lua实现了polling的主要过程。
  3. kong/cluster_events/strategies/postgres.lua目前polling还不支持分页,cluster_events是一个新建的表用来存储缓存更新事件,Kong节点就是来查询这些事件。
  4. 缓存部分换成了lua-resty-mlcache,原来还是和之前分析的类似 L1级别缓存为一个LURcache,在LuaVM里可见, L2级别的缓存为lua_shared_dict,同一个Nginx下的所有worker可见, L3就是缓存未命中的情况,需要调用其他hookup的函数去获取数据然后缓存在L2。只是这里个ipc并不是用的lua-resty-mlcache里的,而是使用的resty.worker.events。
  5. 事件处理部分分两部分,worker之间的事件和node之间的处理,分别由worker_events和cluster_event.lua来处理。
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章