挖井

类库大魔王的挖井日记

挖一口属于自己的井


近况

前些天Google突然宣布中国开发者可以向100多个国家地区发布付费用户,中国开发者注册账号以及收款啥的也都有了极大改进,我本来就一直有想法要在适当的时候注册一个开发者账号的,于是立马冲动地去花了25刀,还把istkani传了上去,不过后来发现一些问题。当初为了买Nexus 5,把这个账号地址设成一个美国地址了,貌似现在这个开发者账号也成了美国的开发者。听说没有办法改成中国的,除非新注册一个账号,囧。发布的app改不了价格,在后台改价格是成功的,但前台看到的价格仍然是老的。不过有一个比Apple App Store方便的地方是,Google Play似乎几乎没审核,发布上传新App的操作也简单得多,之后等几个小时就直接在Google Play里能搜到了。

最近这段时间在尝试用websocket做些东西。本来对websocket没有什么想法的,在我看来只是一种类似twitter stream的技术,据我所以以前twitter stream API其实是用long polling实现的,所以我在公司里做的第一版消息转发服务也是用nginx+nginx push stream module的long polling模式做的。但是不知道是因为我对那个module缺少了解不是为它本身就不够完善,有些需求用它满足不了。比如客户端连了nginx来long polling,缺少自定义authorization的方法,也就是说nginx透传到后端服务器。后端服务器有了什么东西要push给客户端,也只能通过向nginx post过去,nginx才会push给客户端,在我看来这种方式有点畸形。虽然仍然把功能做出来了,也能用了,但第二版时TL就拍板决定自己写websocket来取代nginx push stream module。自己写的话,就要考虑多点问题,比如客户端我们现在有n种平台,包括x86的Gentoo/Ubuntu和Windows,ARM的Gentoo,iOS,Android等,而客户端是统一用C++写了一个底层核心,所以要找一个能跨这么些平台的第三方库,粗略考察了一番,在POCO,websocketpp和libwebsockets中最后选了libwebsockets。否决掉前两者的理由是,POCO包含了太多其他功能,累赘,websocketpp依赖于Boost,而我们不想用Boost,于是只剩下最后一个没得选了。至于服务器端是用Go的,websocket包有官方的go.net/websocket和第三方的github.com/gorilla/websocket两种选择,因为我们的程序已经依赖beego了,又看到beego的例子程序用了gorilla/websocket,而且gorilla/websocket的README里说它比官方那个包功能完善,于是我就选择了后者。

鉴于线上的Relay Server时不时报点问题,然后被人发邮件,又被人问责,我实在烦透了这种状况。于是我决定自己额外偷偷写个Relay Monitor Service。基本架构是这样的,在公网上有一个服务器,所有Relay Server会定时或即时向它报告各种信息,同时又有手机app之类的客户端连上这个服务器,可以查看各个Relay Server的运行情况,遇到一些异常情况或重要情况,比如有进程异常退出,有人修改了配置等,服务器会向手机app推送状态报告。手机app也要有基本的操作Relay Server的功能,比如重启进程啥的,这样在出现异常情况时,我可以及时得到通知,在别人发现前把问题解决掉,省掉被人发邮件被人问责的麻烦。

我把运行于Relay Server上的报告状态的程序命名为rms,服务器命名为rmsd,手机app就叫app client。原则上rms与rmsd,app client与rmsd之间通信都是通过websocket实现的,本来Relay Server上就运行有一个https的RESTful接口服务,可以用于查询一些状态,进行一些操作,手机app client如果可以直接连接上去是最方便的,但是考虑到Relay Server运行于内网的情况,那就行不通了,只能通过rmsd中转了,所以rms要能从rmsd接收各种命令,把其中一些命令转发给原有的RESTful接口服务,再把结果反馈给rmsd,rmsd再转发给app client。相应的Relay Server程序也要做一些修改,至少要把一些状态变更主动提交到rms中,比如进程crash或配置变更,rms反馈给rmsd,rmsd再通知app client。rms和rmsd都是由Go写的,现在已经差不多做完一半了。app client打算用Qt写,iOS的push notification之前已经研究过了,Android的还需要研究。工作并不小啊!

本文地址:

https://minidump.info/blog/2014/11/recent/

上一篇

使用Qt实现iOS push notification

先看一遍Apple的官方文档或者网上随便找个入门介绍文章,知道代码主要要做的是在AppDelegate里开头做点初始化工作,然后实现几个函数。Qt对各个平台底层都做了良好的抽象和封装,好在有人做过些相关的研究,可以自己写个AppDelegate替换掉原来的那个。那块代码抄过来后,要注意的是因为...…

Qt 全文阅读
下一篇

对Go不够熟练

虽然使用Go语言写东西已经有一段时间了,但仍然不是很熟练,一些常见的用法仍然要不停地翻官方文档和搜以前写过的代码。前些天用Go的zlib包对数据进行压缩再传输,发现小数据量,比如4MB以下,总是压出结果只有2字节,这是明显有问题,实际上大点的数据量,比如5MB或更多,虽然压出的结果不是2字节了...…

Go 全文阅读