大概在我集中隔离快结束的时候,运营发来一张照片,说我们最近好多解冻怎么都没有生效,一直在审核中。当时我还是比较诧异的,系统已经差不多一个多月没上线,居家办公的这个一个月线上也没什么问题,怎么会这么多解冻没生效呢?
当时第一反应是查下线上日志看看,一般这种情况大多是因为网络问题引起的。我的日志令牌一个放在了上海,一个放在了公司里,好不容易找到同事借了一个日志令牌,正准备查呢,想起来这个问题是不是上周五另外一个哥们上线导致的。虽然他最终没有上线完成,但是相关配置是上线了的。而我们的broker系统是有个已知bug的,消费者中有一个返回失败,那么其他的消费者也是收不到消息的。
赶忙联系了那哥们,确认了下,果然是配置上了,而相关代码没有上线。这就坑了,配置到broker系统的http接口相关代码没有上线,那肯定是404啊。又赶忙找运维确认了下broker系统日志,果然,调用到这个接口的地方都404了,导致后续通知解冻的接口收不到相关信息,从而解冻一直在审核中。
问题确认了,接下来就是修复的事情了。查了下broker系统暴露的接口,有让配置下线的功能,在测试环境验证了下。我擦,又是一个bug,这个只能让数据库这条记录失效,broker系统回调时候还是会调整这个配置上去的http接口。没办法,只能上物理删除,直接干掉这条记录了。
sql写完了走上线流程的时候有点犹豫,公司之前发生了点合规相关的问题,dba之前口头上和另外一个同事沟通过,说之后是不能上线物理删除的脚本的。但这次影响有点大,就想试试,谁知道dba竟然可以审批通过,于是也就没再关注,就让另外一哥们追踪去了。哪知道到了傍晚,同事联系我说,dba不执行这条删除的sql。当然真的是想骂娘,不执行你倒是别审批啊,浪费老子这么长时间。
想投机取巧取巧没成功,想上线的话现在也没这条件,居家办公期间公司一般不让上线。只好又重新研究了下broker的代码,发现调用接口的时候只要接口返回200就可以了。这就好办了,我们的接口都是通过nginx反向代理的,那么只需要将暂未上线的接口在nginx配置个200返回就ok了。这个首先和运维沟通了下,没啥大问题,终于顺利的上线了相关配置。
location /account/bpm/audit_result{ return 200 "OK"; } 晚上8点的时候找运营验证了下,问题算是修复成功了。
经验与教训 直面问题,正面解决,不要想着投机取巧,幻想用其他非技术手段解决
系统已知bug一定要尽快修复,否则不知道下次什么时候你就踩上了
上海疫情扩大之前,组里有个交易导出的需求,主要是会一次性导出几百万上千万的数据。之前都是直接生成csv格式的,这次运营突然不接受了,必须要excel的。这个开始还没怎么重视,不就是换种格式吗?也没什么大不了的,不就是两天时间的问题。
组里兄弟哼哧哼哧干了两天,晨会的时候抛出一个问题。我写的代码在本地电脑上都是可以正常的生成xlsx文件,但是到了测试环境就不行了。系统一直卡在那里,死死的就是不动。当时也没在意,让他不行就继续csv吧,大不了后续给运营搞一个本地的csv转excel的工具。反正windows下是正常的,也不是什么大问题。奈何领导不同意,没办法只能硬啃这个问题。
上去先看了下兄弟的改动,也没什么大坑。也都是复制粘贴了下以前的代码,然后加上自己的逻辑,至少看起来没啥大问题。远程了下测试环境,触发了下相关操作,果然如大兄弟所说的那样,本地测试毫无问题,测试环境是泥牛入海,操作完之后,啥日志也没有。
没有日志倒也没啥大问题,弄了个线程日志看看。非常奇怪的卡死在了POI对象初始化的时候。问题是这行代码在其他地方也是照常使用,理论上不会有啥问题。最终的堆栈卡在了类加载的地方,也就是loadClass的地方。这就更奇怪了,死锁也不应该在这个地方了,类加载线程无关啊。
问题就在这里卡住了。后面各种查资料,或者想法绕开POI,最终发现都是不行。既然不能取巧,就只能继续硬啃下去了。正好领导在第二天晨会上提了一句,是不是又是jboss类加载的问题。脑袋里突然想到,本地电脑可以,而测试环境不行,可能并不在于操作系统,而是本地环境用的jetty容器,而测试环境用的是jboss容器,两者最大的不同,就是jboss容器中多出了一大堆的默认jar包。
然后就开始翻jboss环境自带的jar与我们项目中打包的jar,发现poi强依赖的xmlbeans的包在jboss和我们项目的lib目录下同时存在,虽然版本一样,但是同时存在可能导致问题。于是就把项目中的xmlbeas在打包的时候给排除掉,重新上测试环境,问题圆满的解决了,猜测可能是两个jar同时加载导致死锁卡住。
整个问题解决过程耗时两天,这种类似问题会越来越少,毕竟后面这种自带jar的web容器已经越来越没有市场。耗时长的一个因素就是在排查jboss包自带包时有所遗漏,导致中间有很大一部分时间在错误地方排查。还有就是总想取巧,想这种老问题,总是想能避开就避开,不想深入研究。但解决问题的唯一办法还是直面应对,这才是最有效的方法。
前几天个人网站从wordpress迁移到了hugo。虽然是纯人工的,但是一切还算顺利。美中不足的文章原来图片上面的描述不见。之前图片描述是通过在markdown中自定义html实现的。没想到同样的方式到了hugo就不生效了。类似于下面这种代码直接加到md的。
<p style="text-align:center;font-size:0.5em;">图片描述</p> 当时着急迁移,也就没细究,今天正好有空研究了下。
Hugo并不支持在md文档中直接添加html代码,我使用的主题paperMod更是直接将markdown中的html直接忽略。还好hugo已经考虑到了这种情况,它使用Shortcodes来解决这种扩展性的问题。
hugo添加Shortcodes的方式如下:
找到你对应的hugo主题下的layouts>shortcodes目录。在目录下新建你自定义的html文件, 并在里面添加自定义的html代码。例如新加了文件imgda.html. <p style="text-align:{{ index .Params 0 }};font-size:0.5em;">{{ index .Params 1 | markdownify }}</p> 直接在md中使用的shortcodes即可。请忽略下方代码的\ \{\{\<imgda center 测试\>\}\} 最终在页面上展示的代码将变为如下形式。 <p style="text-align:center;font-size:0.5em;">测试</p> 这样一波下来,完美解决我的图片描述不显示的问题。有相同需求的同学都可以用我这种方式试试。
近期在v2ex有用户说马斯克开价5k刀让美国一少年不在twitter上爆料他的行程,但是该少年没有接受,并试图让马斯克提高价格到5W刀,当时就大概看了两眼就过去了。这两天在github上看到了一个开源的工程(plane-notify),大概就是这个少年开源的,工程的作用就是追踪某个飞机的行程,并自动发布到twitter等公开媒体上。
开始的时候有点差异,这个只是追踪某个航班的信息,怎么能知道马斯克的个人行程的。能知道马斯克坐那个航班我还需要这个玩意?后面一想,奥,马斯克一般做的是私人飞机啊,这玩意又不长换,追踪它的私人飞机飞那里,可不就知道他行程了。
今天有空把代码拉下来看了下,按照README运行了下。反正一直就是在不断的刷着各种颜色条,跑了一会感觉不对,这玩意像是没有结果了。
异常运行结果
后续又看了下README,发现这个ICAO需要自己重新设定的,原来的那个是随便搞的,肯定是什么信息也查不出来,所以才一直这种绿红的色条一直不断出现,而没有什么实质性的信息出来。
google查了一下这个ICAO,结果倒是很明确,就是飞机的一个唯一应答码/标示码。但是找遍了半天也没找到一个有效的ICAO。主要是也没有现成的例子。在各种飞行网站中找了半天现在还在天上的飞机,也是没找到这玩意。又尝试了几次,终于是有点眉目了,就是过程有点搞。找ICAO的步骤如下:
到FlightAware网站上根据起飞地和目的地找对应的还在天上飞的航班。然后根据航班获取相应的航空公司和机型数据。
航空公司及其相应机型数据
到民航休闲小站中找各个航空公司目前所有的飞机型号及其对应的注册号。
吉祥航空所有飞机型号及其对应注册号
根据注册号到网站Aircraft查询其响应的ICAO。⚠️这个网站是要注册才能查询的。
根据注册号获取ICAO
上面的1,2两步其实都可以在FlightAware完成,直接获取注册号。不过这个需要充值FlightAware会员,为了省钱,我们还是麻烦点吧。 将第三步我们拿到的ICAO替换到原来的值后,重新运行。日志终于打出了相应的航班信息,并最终生成了一张行程图。但是有点奇怪的是,怎么起飞地是赫尔辛基。我搜索的航班明明是上海虹桥到三亚啊?
最终生成的奇怪的行程图
最近闲逛github时看到一个有趣的项目,running_page,可以自动搭建个人运动记录的网站。大概看了下,过程还是很容易的,就是支持的app不多。自己运动的记录还是很多的,一直也想有记录的想法,正好趁着过年比较空,就搭建一下。
对比了下runing_page支持的几个app,最终选择了keep。昨天逛复兴岛的时候尝试了下keep的行走模式,用起来还是很舒服的,最终生成了一个5公里的行走记录。
搭建的过程主要就是按照README进行的,官方的建议是使用公共的静态站点服务搭建。咱自己有nas也不想让别人保存自己的隐私数据,所有最终目的就是把这个项目部署到自己的nas上。
开始是打算部署在nas上的docker中的,找了一个alpine镜像,启动后按照README开始安装python,以及yarn,但是最终在安装nodejs相关依赖时失败了。没办法,又找了个nodejs的镜像,哪知道又在安装python的依赖时失败了,也是没谁了。
没法子,现在自己的mac上试试了。mac上倒是没啥问题,顺利的yarn带来,访问到了本地页面。但是仔细一看,这还是人家自己的样例页面。又根据教程,清除了本地的运动记录。然后开始下载keep的运动记录。一下载就发现问题了,我明明昨天有5公里的行走记录,怎么显示没有相关记录呢?
后面又看了看项目介绍,人家记录的是跑步记录,咱这是行走记录,当然是下载不下来了。看看了代码中的接口,也是大方的写着runing。去官方翻了翻,发现人家没有公开的api接口,这个接口估计也是抓包弄出来的。
开启proxyman,抓了下keep的包。倒是很容易,行走记录的关键词是hiking。替换了代码中的runing,重新执行,昨天的记录被完美拉拉下来。重新打包编译,终于页面上显示了我自己的运动记录。
个人运动记录网站
本地的运行是解决了,下面要考虑的就是nas上怎么跑了。docker上不能动,就只能考虑虚拟机了。还好咱有现成的。unbuntu上安装python及其以来倒是很容易的。但是nodejs就有点麻烦。running_page这个工程支持的nodejs版本是12-16之间,通过apt安装的node版本要么太新,要么太老。其他方式又太麻烦。
还好有nvm这个利器,ubuntu上安装一个命令行就可以解决。管理各个版本的node也是非常容易。弄完它之后,running_page算是顺利的在虚拟机上跑起来了。
配上nginx,加上cloudflare上dns解析,我的个人运动记录网站算是完美搭建起来了。欢迎大家来参观 Jiang Bo Hiking Page