在ATS插件开发过程中,我们经常会需要如下业务需求:
某个插件的配置文件更新了,我们需要让新的配置文件生效,但是我们不想重启ATS.因为作为CDN行业的缓存服务器来说,很大部分缓存是直接使用内存存放的,重启ATS意味着你以前所有的缓存都将清空,这是一个巨大的代价,万不得已我们不会这么办.
那么如何在不重启ATS的情况下,也能让插件的配置文件自动更新呢?
经过研究代码,我发现事实上ATS是专门提供了这个功能的,也就是通过traffic_manager进程来触发traffic_server进程来重新加载新的配置文件,得到配置的平滑过渡,类似Nginx的reload配置文件功能吧.

先不妨区分几个概念:
自动更新, 即时更新, 手动更新
自动更新,一般是程序会在指定间隔时间内检测一下配置文件,判断配置文件的last_modified时间是否有变动, 有变动就认为是配置文件更新了,哪怕你仅对配置文件做一下touch命令而完全没有更改它的内容也是这样,这种定期检测的方法会有开销;
即时更新,一般指当配置文件有更新时,让程序重新加载新配置文件,可以手动触发也可以让程序自动加载;
手动更新,一般就是指重启ATS程序,重新加载所有的配置文件,不管大部分是否有变动,这种方法一般不可取.
我们这里的功能就是插件配置文件的即时更新,就是通过外部的一个信号来触发ATS让它达到重新加载配置文件的目的.是一种最优的解决方案.因为我们在更新配置文件的同时,就通过外部信号让它更新配置文件了,不需要程序自身的探测,也不需要进程重启.

下面说明插件配置文件即时更新的方法,整个过程分为如下几个阶段.
一.注册
以ATS源码中的trafficserver-4.1.2/plugins/gzip/gzip.cc插件为例,先生成一个Continuation,我称为状态机
TSCont contp = TSConCreate(cb_func, NULL);
设置私有数据
TSContDataSet(contp, p=配置文件名称)
注册到Traffic_manager进程
TSMgmtUpdateRegister(contp, plugin_name)
编写配置文件载入函数,它被contp的回调函数cb_func()函数调用
read_configuration(contp)
插入全局hash表,它是动态创建的,按照这种方式更新配置文件的插件的TSCont都会放入这个全局hash table中
InkAPI.cc::api_init()
ConfigUpdateCbTable = new ConfigUpdateCbTable
global_config_cbs->insert()

二.触发
下面使用traffic_line触发,分析traffic_line -x的执行流程如下
main()=>process_args()=>TSinit()=>handleArgInvocation()=>TSTerminate()=>Terminate()
                                     || -x
                                     TSReconfigure()=>Reconfigure()=>ConfigFiles->rereadConfig()=> (如果检测到有配置文件更新,这里会打印出来)
                                     lmgmt->signalEvent(MGMT_EVENT_PLUGIN_CONFIG_UPDATE, "*")
                                     || enqueue
                                     mgmt_event_queue()
                                     ||
                                     LocalManager::processEventQueue()
                                     ||
                                     lmgmt=>sendMgmMsgToProcesses()
                                     ||
                                     mgmt_write_pipe()
                                     || unix socket类型的IPC进程间通信
                                     pmgmt->handleMgmtMsgFromLM()
                                     || MGMT_EVENT_PLUGIN_CONFIG_UPDATE
                                     configUpdateCbTable::invoke(plugin_name)
                                     ||
                                     configUpdateCbTable::invoke(contp)
                                     ||
                                     .......

三.执行
继续接上面的流程
ConfigUpdateCbTable::invoke(contp) 
||
eventProcessor.schedule_imm(new ConfigUpdateCallback(tonp), ET_TASK) 由TS进程中的ET_TASK类型的线程立即执行配置更新
||
用户自己定义的continuation
||
执行用户自己的状态机回调event_handler(),在这里就是插件中定义的加载配置文件的函数read_configuration:

四.使用方法
参见上面一部分的分析,注意触发这个事件的方法是在命令行执行
traffic_line -x

五.缺点
如果有多个插件都采用这种方法,则多个插件都会重新加载其配置文件

备注:要完全理解这种方法的整个流程,需要你跟着上面的线索阅读相关的调用代码,还需要使用gdb调试traffic_manager和traffic_server进程之间的IPC通信,你可以打开records.config的调试开关,指定你要打印的模块消息的前缀如下:
diags.debug.enabled INT 0 改为1 开启调试开关
diags.debug.tags STRING lm.*|pmgmt.* 只打印指定的信息

然后就能看到下面的消息交互了

ATS插件中配置文件自动更新思路相关推荐

  1. delphi 的插件机制与自动更新

    delphi 的插件机制与自动更新 : 1.https://download.csdn.net/download/cxp_2008/2226978   参考 2.https://download.cs ...

  2. CleanAOP实战系列--WPF中MVVM自动更新

    CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: jarvin_g@126.com QQ: 511363759 CleanAOP介绍:https://github.com/J ...

  3. 如何取消掉计算机更新图标,XP系统如何关闭右下角中的自动更新图标?

    相信大家在使用XP系统中,都有遇到过电脑右下角总是弹跳出"您的计算机可能存在风险"这是怎么回事呢?其实这是因为是系统关闭了系统自动更新,那么遇到这种问题该怎么解决呢?其实我们只要把 ...

  4. win2012关闭计算机,一招教你彻底关闭windows server2012 R2中的自动更新服务

    一招教你彻底关闭windows server2012 R2中的自动更新服务 腾讯视频/爱奇艺/优酷/外卖 充值4折起 相信很多小伙伴都有在使用windows server2012,其中的自动更新服务如 ...

  5. 怎么组织计算机更新,如何处理当计算机提示:您的组织已关闭Windows 10中的自动更新!...

    如果您的管理员已禁用Windows Updates或由于自动更新设置中的某些损坏,您可能会看到一条错误消息,您的组织已在Windows 10设置中关闭了自动更新.如果在尝试检查Updates时看到此错 ...

  6. [转载]C#实现软件自动更新思路

    转自:IT实验室 1 前言 长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争 论不休,在这些争论当中,C/S结构的程序可维护性差,布置困难,升级不 ...

  7. 使用valgrind检测ATS插件中的内存泄露

    一.内存错误出现的场景 这几天在重构ATS插件代码的过程中遇到了烦人的内存泄露问题, 周五周六连续两天通过走查代码的方法,未能看出明显的导致内存错误的代码, 同时也觉得C和C++混合编程得到一个动态库 ...

  8. H5+ app自动更新思路

    第一种是一次自动更新 1.在服务器需要一个json或html文件,json最好 {"state":"yes",//是否自动更新"mark": ...

  9. gdb -iex_如何使用IEX Cloud,Matplotlib和AWS在Python中创建自动更新数据可视化

    gdb -iex Python is an excellent programming language for creating data visualizations. Python是用于创建数据 ...

最新文章

  1. Last-Modified、If-Modified-Since 实现缓存和 OutputCache 的区别
  2. mongoose的基本使用
  3. Java 线程——创建和运行线程|| lambda表达式就是一个匿名内部类||Thread 与 Runnable 的关系||FutureTask 配合 Thread
  4. 数据结构与算法17-表插入排序
  5. Android成长日记-使用GridView显示多行数据
  6. c语言程序设计实训教材,C语言程序设计实训指导书
  7. String源码分析
  8. 基于优化反馈的组合在线学习
  9. nginx+kibana代理以及简单认证
  10. 微信公众号开发之创建菜单栏代码示例(php)
  11. 20145307《信息安全系统设计基础》第十四周学习总结
  12. 190506每日一句
  13. 马尔科夫决策过程(MDP) : BlackJack (MC-On Policy)
  14. svn删除远程文件和忽略文件
  15. 【Laravel】快速查阅手册
  16. adb ps shell 查看进程_adb shell查看进程方法
  17. dmg文件 linux,Linux通过命令行建立dmg文件的方法(2)
  18. 谁的盛世————读《饥饿的盛世》有感
  19. 个人如何获取美团外卖推广链接
  20. 我从DuraznoConf中学到了编程的人性化方面

热门文章

  1. MySQL 学习笔记(1)— 创建/连接/选择/显示数据库(表) 查询单列(多列/所有列)/查询返回特定的行数 各种排序(单列/多列/降序/组合排序) 过滤数据
  2. 将动态aspx页面转换成为静态html页面的几种方法
  3. Windows Phone 7 Tip (5) -- App liftcycle
  4. wamp的mysql单独使用_Windows 7+8.1+10 单独安装配置 PHP+Apache+MySQL(不使用 WAMP)
  5. inputstream怎么写给前端_写给“正在焦虑的设计师们”的一封信
  6. python编写赛车游戏单机版_使用Python中OrderedDict模拟一个简单的竞速游戏排名
  7. mysql更新索引不影响业务_mysql索引更新要多久
  8. php 打开动态链接,php调用com组件-dll文件(动态链接库)
  9. mysql数据库中nchar_MySQL数据库中CHAR与VARCHAR之争
  10. usb for android,libusb