转载自:Kris’ Blog

本文的架子参考张开套的《亿级流量网站架构核心技术》这本书分为四个部分:指导原则,高可用,高并发,实践案例。这篇文章说一说前三个部分,大部分内容都是我自己的思考,书只作为参考。

指导原则

书中所列举的,里有一些可能并不是原则,而是技巧。我理解的原则如下:

高并发原则:

  1. 无状态设计:因为有状态可能涉及锁操作,锁又可能导致并发的串行化。
  2. 保持合理的粒度:无论拆分还是服务化,其实就是服务粒度控制,控制粒度为了分散请求提高并发,或为了从管理等角度提高可操性。
  3. 缓存、队列、并发等技巧在高并发设计上可供参考,但需依场景使用。

高可用原则:

  1. 系统的任何发布必须具有可回滚能力。
  2. 系统任何外部依赖必须准确衡量是否可降级,是否可无损降级,并提供降级开关。
  3. 系统对外暴露的接口必须配置好限流,限流值必须尽量准确可靠。

业务设计原则:

  1. 安全性:防抓取,防刷单、防表单重复提交,等等等等。
  2. at least 消费,应考虑是否采用幂等设计
  3. 业务流程动态化,业务规则动态化
  4. 系统owner负责制、人员备份制、值班制
  5. 系统文档化
  6. 后台操作可追溯

以上原则只是大千世界中的一小部分,读者应当在工作学习中点滴积累。
阅读全文

入手了MBP16,但是好多东西用的还是不熟练。 浏览器用chrome一直用的比较多,比较熟。但是Safari自家的跨平台做的还是挺好的。如果快下班了,还有没看完想继续想看的网页,直接点击地址栏位置左边的+号按钮。关机走人。 在手机上,打开Safari浏览器进入像个眼睛似的的那个to read模式,就可以继续看了,而且手机网速不好也没关系哦,手机在wifi的时候已经下载好了。 这个用起来真是太方便了。 开始试着尝试多使用Safari一些,在使用过程中,确不知道怎么查看dom结构,怎么查看源代码,。后来才发现,是没有打开开发者模式的原因,做以下操作: 打开 Safari偏好设置 > 高级 > 选中 在菜单栏显示‘开发’ 然后右键,就可以看到 检查元素 啦。
阅读全文

今天在Linux下使用shell的时候,发现当我想使用Ctrl+箭头进行快速跳跃的时候,并没有出现预期的 光标 移动,而是出现了 5D, 5C 的字样。 这个很奇怪,查下相关资料,可以这样避免: 把以下两行添加到 ~/.inputrc文件中: "\e[1;5C": forward-word # ctrl + right<br /> "\e[1;5D": backward-word # ctrl + left 退出shell再重新登录,就可以解决了。
阅读全文

最近在梳理某项目上各服务接口的性能情况,遇到两个问题。以下是定位和解决问题的一个思路,分享给大家。 业务之前并没有详细的性能日志记录,仅在电信机房(T机房)进行了性能测试,结果是各接口满足预期,服务上线。 在进一步对接口进行性能分析时,对各业务接口的关键路径添加了日志统计,通过日志进行分析,将接口的延迟进行统计,接入Grafana,观察数据后,发现两类问题。 连接MongoDB的服务,网通机房(C机房)延迟比电信机房(T机房)要高。 连接Mysql的服务,网通机房(C机房)延迟比电信机房(T机房)高。 NOTE: 这些服务接口,都是只读,没有写操作。 对两类问题分别进行排查: MongoDB 简单的排查后发现,MongoDB实例有过一次迁移,并且迁移后只保留了电信机房(T机房)的实例,网通机房(C机房)没有从库,所以网通机房(C机房)延迟比电信机房(T机房)高。对网通机房(C机房)部署了从库实例后,却意外发现电信机房(T机房)的延迟比网通机房(C机房)高了。再次排查后发现,代码中配置的MongoDB的读策略是secondary(从库优先),所以网通机房(C机房)有从库后,电信机房(T机房)也去网通机房(C机房)读取,导致了电信机房(T机房)的延迟变高。更改读策略为nearest(就近优先),有所好转,但并没有预想的效果那么好。仔细看下官方文档 The driver reads from a random member of the set that has a ping time that is less than 15ms slower than the member with the lowest ping time. Reads in the MongoClient::RP_NEAREST mode do not consider the member’s type and may read from both primaries and secondaries. 就会发现,nearest是在客户端维护一个到各个实例延迟小于15ms的集合,而我们电信机房(T机房)到网通机房(C机房)是光纤直连,延迟在12ms左右,所以,每次客户端可能会连接到电信机房(T机房),也可能到网通机房(C机房)。 这点在以后的应用中,大家可以注意下。 Mysql 在所有的服务中,只有一个服务接口是读mysql实现的,而这个接口的表现更是奇怪,网通机房(C机房)的延迟比电信机房(T机房)多100 ms+。
阅读全文

家里电脑重装了,想安装chrome,网络不好啊,用online的方式安装,代理都不好设置。 所以最好下载个offline的安装包。 http://www.google.com/chrome/eula.html?system=true&standalone=1 然后开始安装。 安装中遇到了0x80004002的错误提示,使用管理员权限打开又提示 已经有另一个chrome安装中。 解决办法就是 重启电脑,按F8进入安全模式,进行安装,即可安装成功。
阅读全文

有朋友报名东方时尚,理论课选的网上教学,需要看完所有的视频才能算科目一培训完成,在很早之前就有朋友因为这个找过我。当时东方时尚的授课系统还很简单。。每次看完一个视频都会发起一个固定的请求,表示当前视频看完了。所以之前的做法很简单,把那个url在新标签页打开,每开一个视频,刷一下页面,就算看完一段视频了。。所以不用什么复杂操作,很容易就能完成。 不过现在,东方时尚的系统明显升级了,已经不是那么简单的逻辑了,每次请求一个新视频,都会有一个/start的请求,把视频id返回,后边每次心跳和看完视频的请求,都是以该id为参数。不能再像以前那么简单的玩耍了。。本来是想写个chrome的扩展来拦截请求做处理的,突然想到Fiddler的script就可以做这些,而且语法是.NET的,会比较熟:)。 做法也很简单,就是在OnBeforeResponse阶段,获取到body,正则匹配到需要的id,然后再发起一个请求:),多说无益,直接show code. static function OnBeforeResponse(oSession: Session) { if (m_Hide304s && oSession.responseCode == 304) { oSession[“ui-hide”] = “true”; } oSession.utilDecodeResponse(); var oBody = oSession.GetResponseBodyAsString (); var regex = /{“data”:{“streamId”:(\d+)},“/i ; if (oBody.match(regex)) { var matches = oBody.match(regex); //MessageBox.Show(matches ); var s = “POST http://api.dfsstv.cn/api/v1/Stream/End?streamId=" + matches[1] + “ HTTP/1.1\r\nHost: api.dfsstv.cn\r\nConnection: keep-alive\r\nContent-Length: 0\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nDeviceId: 1456634190000\r\nOrigin: http://www.dfsstv.cnrnApiKey: 59d71859d3dd491a8ad6accbe7262d94\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36\r\nAuthToken: a54a874bddfb449cbbf4ed698b4e0fc4\r\nAccept: /\r\nReferer: http://www.
阅读全文

作者的图片

DigDeeply

Technology Stack: PHP/Openresty/GoLang, and so on…

Web Develop Eneigneer

Beijing China