十二赞日志收集与报警系统简介

先快速介绍一下十二赞的日志收集系统:十二赞的日志收集系统,分为两块,一块是线上系统的各种报错、异常的日志收集,主要是各种线上代码运行期间产生,我们称之为log-collect,一块是用户行为操作的日志收集,主要是由各个业务系统根据用户的行为来上报,比如用户A访问了xx页面,用户B收藏了某某商品等,我们称之为eventdb。

基于这两块的日志收集,我们实现了一些自己非常自豪的特性。比如,基于log-collect,我们做到了能够主动去发现问题,抢在大多数客户发现异常之前,就把问题处理掉,从而做到不断地提高Saas系统的可用率和稳定性;基于eventdb,我们能做到非常完善的行为收集,将我们的返利模块、分销模块的准确度、实时性大幅度提高。

下面我们介绍一下系统的架构。

从需求上,我们认为log-collect是为了及时发现问题,并马上解决掉。但是这些日志,在我们解决掉问题之后,是不需要再保留这个日志的。比如,举个例子,用户注册的时候,可能输了一个12012345678的号码,这个号码是不对的,导致我们的验证短信发不出去,短信模块就会报错。我们的log-collect会收集到这条报错日志,马上告警。开发同学收到告警通知时,就马上去处理这个问题,用户输入120这个号段时,提示用户该号段是不被支持的,以后就再也不需要处理这个了,因为这条告警日志,我们是不存的,只存档15天就丢弃掉。

但是对于eventdb,我们的目标是为了对这些数据做分析,这些行为一般会跟财务相关,比如用户A通过用户B分享的链接进到了系统,5分钟之后有户A购买了商品付款了200元,2天后用户A退掉了其中的80元。这些数据,会影响到商家给用户B结算cps款项。类似这些数据,我们是永久存储的,不会抛弃。同时,这类数据,我们是要在保证准确性的基础上不断提高实时性的。所以对这类数据,我们有两条线来处理,一条是在线实时,一条是离线的一个小时跑一次数据的。

log-Collect

基于这种差异,我们在架构上也有不同。下面是log-collect的架构图:
https://ylpicture.oss-cn-beijing.aliyuncs.com/201811/48370500.8048.png

我们每一台服务端机器上都有一个live tail,实时监控日志文件,一旦日志文件有新的写入,就立刻发送到http的一个日志网关。这个网关就立刻把这条件日志推送给一个广播服务器,并写入到一个数据库(数据库会清掉7天之前的数据。)这个数据丢给广播服务器了之后,会在特定的频道进行广播。我写了一些客户端,订阅广播,根据日志内容的不同,将日志发给倍洽上不同的告警频道。(关于bearychat/中文名倍洽,大家可以自行去其官网上了解)。手机上装了倍洽,就可以随时接受告警通知了:
https://ylpicture.oss-cn-beijing.aliyuncs.com/201811/82177300.jpeg

eventDB

下图是eventDB的架构图:
https://ylpicture.oss-cn-beijing.aliyuncs.com/201811/87788400.6795.png

与log-collect相同的,收到新的行为事件后,网关也会在一个特定的频道进行广播。不同的有两点,一点是另一条链路先把行为事件写入到阿里云的oss存储起来,然后写了crontab每小时、每天定期从oss文件里导入到eventDB这个数据库;另一点是广播客户端工作的事情也变成了实时写入到eventDB这个数据库。

在事件收集上,也不一样,log-collect是在所有的服务器上部署了LiveTail来从日志文件中读取,而eventDB是需要各个业务系统自己向日志网关来汇报事件的。

存入数据库之后,后续就是再对这些数据进行分析,查找用户的来源渠道,计算佣金等等操作了。

 

如何快速搭建小程序商店?十二赞开店流程详解

有生意就有十二赞,十二赞提供小程序开店工具并提供围绕小程序的移动电商营销解决方案。

如何快速搭建小程序商店?您需要按照如下步骤进行:

一、准备工作

标准流程如下:

1.1 注册微信服务号并认证(认证费腾讯官方会收取300元);

1.2 在微信服务号后台复用资质快速注册小程序;

注意:

请完善小程序信息,如名称、图标、服务类目等。

选择相应服务类目,服务类目审核比较重要,请根据您所销售的选择对应的类目。特殊类目需要提交相应的资质材料进行审核。

1.3 在小程序后台开通微信支付,申请微信支付商户号,微信支付商户号审核1-5天,在此审核期间可以操作十二赞后台了(如已有商户号可直接使用,如果不是在小程序后台开通的微信支付可咨询十二赞客服)

二 、在十二赞后台(https://sky.z.12zan.net/)完成小程序商店搭建及微信支付配置,生成小程序并提交审核直至小程序店铺开启

按照如下标准流程进行:

2.1 在十二赞后台(https://sky.z.12zan.net/)商品管理里搭建小程序店铺(上架商品不少于四种)

2.2 在十二赞后台系统设置里完成绑定小程序

2.3 在十二赞后台系统设置完成版本管理直至生成体验版,同时完成系统配置的微信支付配置,查看体验版无误,可顺利完成支付时方可提交审核

2.4 审核通过,发布,小程序上线,小程序店铺正式开启

是不是很简单?那就开始吧!

**********************************************************************************************

准备工作详解:

1.1 微信公众号后台(https://mp.weixin.qq.com/)注册微信服务号并认证:

 

 

 

 

 

 

1.2 在认证好的微信服务号后台复用资质快速注册小程序

 

补充完小程序信息

 

根据实际情况选择相应的服务类目

 

1.3 在小程序后台开通微信支付,申请微信支付商户号(如已有商户号可直接使用)

 

 

二 、在十二赞后台(https://sky.z.12zan.net/)完成小程序商店搭建及微信支付配置,生成小程序并提交审核直至小程序店铺开启

2.1 完成十二赞后台注册,在十二赞后台(https://sky.z.12zan.net/)商品管理里上架不少于四款产品

 

 

2.2 在十二赞后台系统设置里完成绑定小程序

 

具体的对应在小程序后台的如下位置:

 

2.3 十二赞后台系统设置完成版本管理直至生成体验版,同时完成系统配置的微信支付配置,查看体验版无误,可进行顺利完成支付时方可提交审核

 

同时完成系统设置里的微信支付配置

 

这里该如何填写?

登录你的商户号后台(pay.weixin.qq.com),点击“账户中心->账户设置->API安全,自助设置32位API密钥即可(请事先将需设置的密钥用文档记录,设置成功后不支持查看,可支持修改重设;如果此商户号正在使用,请谨慎重置。重置密钥有可能会导致正在使用的商户号无法正常使用), 将重新设置的密钥填写到上图中的相应位置即可

那么API安全压缩包呢?在此下载证书即可

 

查看体验版无误?扫描体验版二维码,进入体验版,点击任何一件商品能够顺利走向支付说明支付配置无误。

 

查看体验版无误后,方可提交审核。注意:每个小程序每天可以撤销审核一次,一个月可撤销10次

2.4 审核通过,发布,小程序上线,小程序商店开启

注意:十二赞的版本会不断迭代,请注意十二赞后台提示及时更新版本,选择最新版本以达到最佳体验。(更新版本需要:提交版本、提交审核、微信审核、发布。)

有生意就有十二赞,十二赞提供小程序开店工具及围绕小程序的移动电商营销解决方案。

如何在小程序后台添加微信支付?

如何在小程序后台添加微信支付呢?按照如下流程开始:

1 登录小程序后台;

 

2 补充完整的小程序信息和服务类目:

 

 

3 记录下小程序后台的设置-》开发设置里的AppId和AppSecret(注意:这里的是小程序后台的)

 

4 进入微信支付商户后台-》产品中心-》APPID授权管理-》新增授权管理-》填写步骤3中的AppId-》至审核状态

 

 

 

 

 

5 进入mp.weixin.qq.com登录小程序后台-》微信支付-》M-A授权-》确认

 

 

6 进入微信支付商户后台-》API安全-》下载证书&设置密钥并记录下密钥(保存证书,密钥设置要求是32位且数字和英文大小写字母组合)

 

有生意就有十二赞,十二赞提供小程序开店工具及围绕小程序的移动电商营销解决方案。

Golang 在十二赞的深度应用

作者为黄滚,十二赞小程序开店平台创始人。2007年至2016年在阿里巴巴任职,曾担任中国雅虎平台技术主管、淘宝搜索研发专家。

我们是“十二赞”,一个致力于帮助电商卖家进入小程序的小团队,我们的主页是http://www.12zan.cn/。在实际运行中,我们使用了大量由golang写就的小工具,几乎每一个工具代码量都超短,一般在200行左右就完成了一个独立的功能,同时担当了相当重要的角色;像代理服务器,代码量一共500行多一点点,却是我们的核心支柱,压测时QPS也直追nginx,表现优异。

基于Docker的基础结构

做为基础架构,我介绍一下我们的机器架构。
我们的整个业务构建于阿里云之上,有5台server,每一对都有独立的外网IP,同时也在同一个内网之中。在每一台机器上都跑了一个我们自己用golang写的守护进程,这个进程负责监听一些业务重启、新增域名等类似的指令并执行(这些指令最后都传递给了docker)。同时,每台机器上都有一个consul进程,这些consul都join到了一起。另外,我们每一台机器上,都用docker跑了一个nginx来做80端口的服务,同时跑了一个用golang自己写的HTTP代理。nginx做做日志啊基础的功能之后就把请求丢给这个http代理 ,HTTP代理会到consul里去查应该将请求转发到哪个IP的哪个端口上。

400行Golang代码写的HTTP Proxy

在架构选型的第一天,我们就决定,我们会服务化,会大量使用http 接口来提供服务,并使用自己的http proxy来分发请求、添加自有的一些业务逻辑比如API的权限验证等逻辑。我们限定,所有业务,域名都是*.app.12zan.net,比如我们要上一个聊天服务,请求的接口就会是chat.app.12zan.net,哪天再上个评论服务,请求的接口就是comment.app.12zan.net。
确定域名后我第一件事情,就是拿golang自己写了一个非常简单的基于consul的http proxy server;感谢Golang这完善的HTTP库,我们只用了几百行代码就完成了所有功能。每当有http请求过来时,这个proxy server就会根据HTTP请求中HTTP_HOST 字段去consul去查,有哪些后端是用这个域名名称来注册服务的,并根据指定的算法,取出一台后端来,把这个HTTP请求Proxy过去。每个具体的业务,可能运行在我们5台机器中的任何一台之中的docker上,也可能是多个docker实例上。所以这里有一个机制,选择哪个实际的docker实例来服务这个请求的问题。我们现在支持随机选取、按客户端IP地址做hash之后选取、按URL做Hash选取、按负载选取几种方式。

WEB服务的服务注册

基于php+laralel和nodejs+koajs两种场景,我们制作了自己的docker镜像。这个镜像除开可以将php+nginx和nodejs构建的web服务运行起来之外,还包含一个golang写的consul客户端。在docker容器里,这个客户端随着php+nginx或是nodejs的web服务一起启动,启动之后会向宿主机的consul 进程注册自己这个服务,注册的时候会通知说,某某应用,在某某IP某某端口提供服务啦,如果前面有到**.app.12zan.net的请求你可以转发给我;同时会每隔一秒上报自己的进程数、当前机器CPU占用、内存占用情况。也是一样的简单,几百行golang代码,就鼓捣出了这个consul客户端。为什么使用golang呢?第一个原因当然是因为consul天生是golang阵营,第二个,是因为我们的docker容器种类较多,所以这个客户端直接就是在Mac上跨平台编译出来的在linux64平台上运行的,不管docker容器是python为基准的还是ruby为基准的,还是nodejs的,只要把这个二进制文件拷贝进去就能正确运行,不像别的语言需要解决依赖问题。

我们还开发了一个web console界面,在这里,我们可以注册app,也可以为app新增实例。注册app时,我们要指定代码仓库的地址(对了,我们的代码管理是用的golang写的gogs),指定对外服务的域名,指定是nodejs应用还是php+laravel应用。添加应用之后,可以在这个应用下新建实例,让系统在指定的IP上去跑这个实例。实例运行的过程实际就是下发一个通知到某个机器上,去执行一个docker实例启动的过程。docker启动的时候带了一些环境变量,比如当前内网IP、docker监听的端口、对外提供服务时是用何域名提供服务。

日志和存储

前面这种架构有一个问题,就是后端可能是在任何一台机器上运行的,今天可能是A,明天可能是B,那我要是把文件存在A上了是不是让B来提供服务的时候就挂掉了?所以我们想了这么一个办法(也是因为穷。。。。),我们把所有的文件都挪到阿里云的OSS服务上。同时为了不管是Nodejs应用还是php应用 还是python写的应用都能做到把用户上传的文件或是系统生成的文件存到oss上面,我们很省事地写了一个ossUploader,编译好的可执行文件发布,只需要执行它,传进来本地路径和oss上的目标路径,就保证给你上传到oss上去就完整,不需要再在nodejs、php、python、ruby、java各种平台下都琢磨一遍oss的SDK。

对日志的处理是一样的, 所有的日志文件的内容,都会被一个golang写的工具gtail监听着(就像linux 的tail -f命令一样),所有新产生的内容都会被gtail挪到oss上去存储。当然,也是可执行文件发布的。

这个实现之后, 我们的实际业务就真正可以在5台机器上之间任意腾挪了。

消息广播

得益于golang的一些开源仓库,我们还做了一些好玩的东西。
比如,看到https://github.com/gorilla/websocket这个东东,我们忍不住撸了一个websocket server,或是说叫群聊服务器更好一点。
接下来,我们看到有一个golang的库叫go-mysql-elasticsearch,伪装了一个mysql的slave,去MySQL的master机器上去读binlog,读到binlog以后就将MySQL里的数据发送给ElasticSearch去索引数据。
我们就结合了一个,把这两个结合起来,修改了一下go-mysql-elastichsearch,让它监听到MySQL的数据变更之后,在WebSocket server的某个群聊里推送出来,形成一个数据变更的广播。
再接下来我们就可以用nodejs写一个应用,连上这个websocket server,加入特定的某个群聊,就源源不断地收听到数据变更的消息。这个nodejs端的代码就非常简洁了,只需要不到100行代码可以做各种好玩的事情,比如监听到用户留言表有新增,可以发邮件让运营马上去审核。还有比如说,每当订单表有成交的时候,我们某个小小的nodejs应用因为监听了数据库消息,第一时间就知道了,马上就去追溯用户来源,来计算返利;同时这个nodejs的代码更新是和订单主逻辑完全不相关的,写这个业务的开发人员只需要知道订单表的结构,不需要了解订单应用后台代码。