记得去年此时,CI/CD还是相当的火。SRE工程师的招聘职位也很多。但是不得不感叹技术发展之迅速。到今年,CI/CD已经成了必备功能,很少再听到专门拿出来说事了。 最近在拿springboot做一个小项目,部署到ec2上面。刚好客户那边对CI/CD也有需求,于是就尝试了下codebuild,codedeploy跟codepipeline的组合。 网上关于这方面的介绍已经很多了,我只把自己尝试过程中踩过的一些坑发出来作为分享。 Codebuild 我的springboot项目是拿maven做管理的,所以其实codebuild只是帮你执行了以下mvn install的命令而已。(这里要吐槽以下codebuild不够智能的地方:local几秒钟build完成的东西,在codebuild上,每次都要重新下载所有依存的jar包,每次都要多花去5-6分钟)只是唯一要注意一点的地方,为了deploy顺利进行,需要把appspec.yml跟jar包传递给codedeploy。 version: 0.2 phases: install: runtime-versions: java: corretto8 build: commands: – mvn install artifacts: files: – target/cms-0.0.1.jar – appspec.yml –

Read More

之前为了解决github跟slack用户相关联的问题,拿hubot在heroku上面部署了一个小程序,但是偶尔会出现程序虽然在运行,但是slack通知不成功的现象。 这些往往出现在程序运行一两个小时以后,重新启动heroku的dyno可以暂时消除问题,但依旧无法解决问题。 后来猜测,是不是长时间不调用webhook,或者不使用hubot,就会导致程序挂起,于是,在heroku的addon里,安装了一个Heroku Scheduler、然后添加了以下命令,尝试10分钟health check一次。 $ curl -X ‘POST’ -H ‘X-Github-Event:health_check’ https://xxx.herokuapp.com/webhook 但是很遗憾,过一段时间后,slack依旧通知不成功。 后来就考虑能不能定时重启dyno,这样总可以了吧。 在网上找了一些hroku重启的方法,大部分都是 heroku restart 的方法。但是这是安装了heroku的cli的前提下,我们部署到的heroku服务器上,其实是没有安装cli的。后来,在stackoverflow上面,看到其实heroku有提供api,于是采用了以下方法,定时重启dyno,算是暂时解决问题了。 $ curl -n -X DELETE https://api.heroku.com/apps/xx/dynos -H “Content-Type:

Read More

最近工作中碰到系统故障,分析log文件进行原因调查时,又用到了各种文件处理的命令行,尤其是awk命令,深感它的便利性。虽说这些命令的用法去网上一查就会出来一大堆,但是,真正碰到问题时,能够信手拈来的话,还是能极大的提高效率的。以下简单的总结了下这次的示例,算作是自己的学习笔记,以后有时间回顾一下也有助于理解和记忆。 ・all_salary文件(公司全员的工资表) (姓名,工资) AA,1001 AB,2001 AC,3005 BB,2043 ・it_dept_list文件(IT部门的员工表) (姓名) AA AC ・目的: 分别计算出IT部门和IT部门以外员工的平均工资。 当然,如果把这些数据插入到数据库里,一个select语句就可以解决问题。不过这次是为了练习linux命令的使用方法,所有数据都是以csv文件形式进行处理为前提。 各命令行的执行流程: ①将部门员工表于总表进行结合,抽出部门员工的工资一览 join -j 1 all_salary it_dept_list > it_dept_salary ※-t ‘,’可以指定分隔符 ・it_dept_salary

Read More

去年年初做项目的时候接触到了OAuth认证,当时是选用了一个opensource的叫做KeyCloak的产品。项目中学到了很多关于认证的知识,之后一直想简单做下总结来着,后来一直拖了快一年。这几天又重新拾起来。可是,等自己查阅了几篇文章开始着手写的时候,才发现我对于OAuth和OpenIdConnect的理解实在是太浅薄了。 我知道想要深入理解和掌握OAuth 和OpenIdConnect自己还有相当大的距离,现在姑且只把我之前学到的东西总结一下,只当是自己的学习笔记了。 提到认证,可能最先想到的就是账号密码的认证方式。例如BASIC认证,在web服务器端设置好账号密码后可以应用到所有的http请求页中。但是,它的缺点非常显而易见: ・每次请求都需要输入账号密码 ・每次通信内容中都有账号密码的信息,信息泄漏的危险性很大 因为传统账号密码认证方式的诸多缺点,web服务大部分都使用了如下方式: 只在第一次登陆的时候提交账号密码,然后把认证完了的状态存放在session里面,client通过把session_id传递给服务器,服务器就可以判定请求来自于谁,以及是不是经过认证了。 这种认证方式里面已经开始出现了认证和认可的概念了。认证是判定请求来自于谁。而认可是判定是不是经过认证了。 (据说认证和认可就是OAuth和OpenIdConnect的区别) 上面的方式基本实现了认证和认可的功能,但是后来出现了稍微复杂的情况:如何能在多个服务器之间共享认证和认可的信息。例如如何用QQ号登陆百度就是一个很典型的例子。 这种情况下就需要用到OAuth认证方式了,先简单概括一下: QQ拥有用户信息,负责认证,拿QQ号登录成功以后,QQ将认可状态交付给百度,百度记录下认证状态,然后就可以访问百度的服务了(也就是说百度负责认可)。 具体的认证过程可以参照下面的图示: ※本图来自于 http://www.atmarkit.co.jp/ 在这个流程中有那么几个关键词需要解释一下: ・client_id、secrect 由调用的service provider(上面例子中的QQ服务器端)发行的用来识别client(百度)的信息。一般来说,secret不用每次都发送。 ・code 认可代码,用户认证完毕以后,由service provider返回的代码,受到认可代码就可以判定认证OK了。 ・access_token 认证完毕以后,如果想要调用service

Read More

一直觉得那些能写博客或者知乎上能得到很多赞的人很了不起,他们不仅对于自己掌握的知识理解的很透彻,还能讲他们通俗易懂的解释给别人。我一直都不太擅于总结,感觉自己花了很多时间去学习,接触到的知识也不少,但是真正能为己所用,并且表述出来的很少。其实,只有你自己把你学到的表述出来了,你才是真正的掌握了它们。或许有时候是因为太忙,没时间,而忘记了总结。但是其实大部分时候还是因为太懒而放弃了总结。 最近工作中为一个系统的服务器更换而做了一些调优的设置。感觉解决问题的思路是这次收获最大的。因此尝试着进行了下总结: 首先,为何要做这次性能调优的工作。 之前我们的系统运行在tomcat+apache架构组成的6台服务器上。但是因为性能逐渐不足,加上之前的服务器是跟别的系统共用,已经没办法再扩展了。所以决定搬到一个全新构建的服务器集群下。加之公司规定,新构建的系统一概采用Nginx+Wildfly的架构,所以新环境里采用了Nginx+Wildfly的架构,而为了达到对硬件资源的有效利用,对它们分别进行了一些性能的调优。 关于性能调优的一个基本的思路,我的理解如下: 影响服务器性能的三个主要因素: CPU(计算能力)+IO(读写能力)+内存(存储能力) 测试达到最大性能时的瓶颈因素,然后找到原因,尝试修改中间件的设置或者系统代码去降低瓶颈值,以便让所有资源得到充分利用。 找到瓶颈很简单,但是找到原因就不太容易了,总结下到到目前为止遇到和处理过的问题,我给出一下几个建议: 如果系统逻辑很复杂,最好检查最耗费资源的处理是不是妥当(分析Thread dump) 如果对象是db服务器,需要查找最耗时的sql需不需要能够优化(分析Sql dump) 如果服务器资源还没达到最大利用率但是处理件数却已经达到极限,就需要看看中间件的设置是不是有问题(调整heap size、thread pool等设置)。 然后,分享下这次调优的过程: 测试工具:Jmeter 测试客户机:5台左右 服务器架构:web服务器1台(nginx),application服务器1台(wildfly) 服务器硬件:web服务器跟application服务器分别是2核cpu,4G内存,100G硬盘(无ssd) ①逐渐调整Jmeter件数,大概在每秒900/件的时候,错误开始频繁发生 ②通过log查找出错误的原因在Web服务器(Nginx) 错误内容: socket()

Read More

现在担当的一个ec网,前不久因为系统bug,出现了未给部分用户计算折扣的现象。因为用户的id输出到了日志中,后来就把这些id抽出来,通过跟另外一个master文件进行对比的方法来进行恢复工作。 插图 一般这种情况下,使用excel的vlookup函数都能够简单实现,但是因为母数据有30万件,直接粘贴到excel里面会导致系统死机,而这些数据因为都是个人情报,不能从没有数据库的商业环境里抽取出来,所以很是麻烦。 大家都束手无策的时候我当时提议拿java写个程序去查找。虽然现在看起来很傻,但是当时大家还是相当欣赏这个提议的。至少不需要人海战术去手动查了。 记得当时时候拿java写了这么个小程序: idFile = openFile(开存放id的文件) while(line = idFile读取一行){ masterFile = openFile(master文件) while(target = masterFile读取一行){ if(line == target) { 输出line break; } }

Read More

MapReduceでググたら、下記の説明文が出てきました: MapReduce(マップリデュース)は、コンピューター機器のクラスター上での巨大なデータセットに対する分散コンピューティングを支援する目的で、Googleによって2004年に導入されたプログラミングモデルである。 分散コンピュータリング処理のことらしい。実際どんなふうに分散するでしょうか? 下の図がとてもわかりやすく説明できていると思います。 ※From ITMedia やりたいこととしては、Inputを処理して、Outputを出したい。 その手順は下記のイメージ: ①Inputを分割して、複数のworkerにアサインする(Readステップ) ②それぞれのworkerが決められたルールで自分をのnputをさらに分割する(Mapステップ) ③Mapステップで処理した結果をもらって、複数のworkerがOutputをだすために処理を行う(Reduceステップ) ④Reduceで処理した内容をOutputに変換する(Writeステップ) この処理フローは順次実行のプログラムより複雑のように見えますが、 ビッグデータを処理する際は、この処理フローを使うと、複数のスレッドまたはサーバに分散&並列処理ができます。 ※MapとReduceのロジックだけ考えればいい http://www.atmarkit.co.jp/ait/articles/0807/08/news119.html https://ja.wikipedia.org/wiki/MapReduce

Read More

一直以为3d图形编程是那么的困难,在此之前也从没触及过。直到前几天,一次非常偶然的机会,需要做一个类似于ipod的专辑滑动效果的flash,从网上找到了一个叫做coverflow的特效,阅读了源代码,才发现,3d图形编程其实也还挺简单的。 之前之所以认为困难,尤其是因为搞不懂如果在一个3d空间里视角转换了的话看到的物体究竟会怎么变,说实话,如果从0开始想怎么用程序去实现的话确实很困难,但是如果使用构造好的模型或者说是引擎来去实现的话,一切就都简单了。

Read More

从matrix67的网站上翻到了一篇关于停机问题的文章,细细思考了一下感觉挺有意思,证明非常的巧妙。 http://www.matrix67.com/blog/archives/55 停机问题的简单表述其实就是不能写出程序来判断一个程序是死循环。 为什么,”背叛法“来证明:

Read More
Close Bitnami banner
Bitnami