分类 开发笔记 中的文章

记一次伪并发引起的bug

一次较典型的问题排查过程, 分享一下, 欢迎指正和交流. 相关背景 内网有两个应用A和B, 其中B提供两个服务化接口B1和B2, 外网有一个应用W提供两个HTTP接口W1和W2. 内网的A通过RPC与B通信、B通过HTTP与W通信. 画了个简图如下 应用A:A首先调用B1(设置了一定的超时时间), 若超时则调用B2. 应用B:B1调用W1(设置了一定的超时时间), 调用W1成功后写入记录供B2调用W2时需要. 问题表象 观察应用B的日志发现, 有少量的B2被调用的 “记录不存在的” 业务异常日志. 根据这些异常日志分析出可能的一种情况: B1与B2 “同时” 由A发起调用, B2先行到达被处理, 引起这个异常. 从日志中也确实发现了 “记录不存在的” 的异常日志与B1的被调用日志在同一秒钟被记录到. 真的是并发引起的么? 问题追踪 理论上来说, A发起调用B1与B2, 即使是同一秒钟, 也不大可能是同一时刻. 这是因为A的逻辑决定的, 在调用B1超时后才会调用B2, 至少也是相隔了个超时时间段. 而后与A的负责人沟通得知, 调用B1的超时时间是300ms, 且找了几条异常日志对应的B1调用记录发现, 都存在同一个共同点: 耗时较长超过了300ms. 从这里可以分析出来, B2的调用至少隔了300ms才会被调用. 再次观察对应的B1调用链发现: 耗在调用W1的时间基本都在300ms以上. 这样疑问就很清晰了: A发起调用B1(超时500ms), B1发起调用W1(超时300ms). W1响应时间超过约300ms后A认定超时继而发起调用B2, 而此时B还在等待W1的响应因而没有写入记录导致A调用B2引发 “记录不存在的” 业务异常日志. 解决方案 为避免外网系统对接的超时问题, 其实内部已经有了一套较为完善的隔离方案, 这个隔离方案简单来说就是在白名单内的走单独一套超时限制较宽松的系统. 因为上面说的案例比这个隔离方案出来的时间早且比较仓促, 没有设计隔离方案且一直没有进行接入. B2接口的实时要求不高, 可以异步处理, 暂时把B2的逻辑处理延迟1s后处理. 欢迎留言交流~……

阅读全文

一个校园类微信公众平台

服务器 服务器方面,老师提供了一台位于研究所某个实验室的机器:公网IP肯定是有的,2M独享带宽,配置也相当不错,8核 Core™ i7-2600 3.40GHz处理器、20G内存、500G硬盘。但蛋疼的是到现在80端口都无法使用,应该是电信给禁用了,但老师说这个不是家用的线,应该不会禁用,正在联系当初办理的老师……. 首要任务当时保证服务器的安全,说实话,机器放在那屋,真揪心,,谁不小心给关机了或者拔电源什么的,就……估计以后项目进行时也会换用VPS…先简单配置一下,毕竟暴露的互联网上,也没有硬件防火墙… 网络配置 首先得先连上网啊,不对,首先是装系统,呃,CentOS 6.5 basic server。好,接下来是网络配置 - 配置DNS /etc/resolv.conf > nameserver 219.149.6.99 > nameserver 219.148.204.66 > nameserver 223.5.5.5 配置网关(下面的地址都是虚构的) /etc/sysconfig/network > NETWORKING=yes > HOSTNAME=localhost.localdomain > GATEWAY=59.59.59.59 配置IP地址 /etc/sysconfig/network-scripts/ifcfg-eth0 > DEVICE=eth0 > HWADDR=2C:41:38:00:00:00 > TYPE=Ethernet > ONBOOT=yes > NM_CONTROLLED=yes > BOOTPROTO=static > IPADDR=59.59.59.59 最后重启网络服务 > service network restart 安全配置 https://www.linux.com/learn/tutorials/305769-advanced-ssh-security-tips-and-tricks http://www.cnblogs.com/jembai/archive/2009/03/19/1416364.html 更改SSH端口 /etc/sysconfig/iptables 添加要更改后的端口规则,比如2222,对比这22端口那条规则写就好-A INPUT -p tcp -m state --state NEW -m tcp --dport 2222 -j ACCEPT,使生效service iptables restart /etc/ssh/sshd_config 在#Port 22下行添加Port 2222,使生效service sshd restart 测试新端口能否ssh登录,可以的话就可以删除防火墙里的22端口规则了 禁用ROOT ssh登录 /etc/ssh/sshd_config ,找到#PermitRootLogin yes更改为PermitRootLogin no ……

阅读全文