C++多进程并发框架

         三年来一直从事服务器程序开发,一直都是忙忙碌碌,不久前结束了职业生涯的第一份工作,有了一个礼拜的休息时间,终于可以写写总结了。于是把以前的开源代码做了整理和优化,这就是FFLIB。虽然这边总结看起来像日记,有很多废话,但是此文仍然是有很大针对性的。针对服务器开发中常见的问题,如多线程并发、消息转发、异步、性能优化、单元测试,提出自己的见解。

面对的问题

从事开发工程中,遇到过不少问题,很多时候由于时间紧迫,没有使用优雅的方案。在跟业内的一些朋友交流过程中,我也意识到有些问题是大家都存在的。简单列举如下:

  • 多线程与并发
  • 异步消息/接口调用
  • 消息的序列化与Reflection
  • 性能优化
  • 单元测试

多线程与并发

现在是多核时代,并发才能实现更高的吞吐量、更快的响应,但也是把双刃剑。总结如下几个用法:

  • 多线程+显示锁;接口是被多线程调用的,当被调用时,显示加锁,再操作实体数据。悲剧的是,工程师为了优化会设计多个锁,以减少锁的粒度,甚至有些地方使用了原子操作。这些都为领域逻辑增加了额外的设计负担。最坏的情况是会出现死锁。

Chaos网络库(二)- Buffer的设计

对于buffer的设计,chaos和其他网络库的做法稍有不同,就拿libevent-stable-1.4.13(以下所提到libevent处皆为该版本)来说,它采用一种能够自动扩张的buffer,基本策略如下:

1. 当缓冲区不够存放新数据时,它会先在内部做marshal,看看是否能够腾挪出足够的空间

2. 假如没有满足,那么对buffer进行expand, 大小为原来的两倍,扩张之后该buffer就不会缩小

另外,libevent中有两个buffer,input 和 output, 分别代表读缓冲和写缓冲,libevent对他们扩张时的策略稍有不同

对于input,libevent限定它最大的缓冲大小为4096,这对于现在的网络环境,尤其是内网环境肯定是不太够的

对于output,libevent没有限定大小

这样做在普通的稳定传输下不会有什么问题,但是假如上层将很大的一块数据块(1MB以上)放进output,或者是上层快速地将小块数据放入output,而底层的IO复用的线程由于某些情况没有来得及响应,都会导致output增长到非常大的程度,而由于buffer只能伸不能缩的性质,在之后的传输过程中内存使用率就会很低

考虑这样一个场景,一个应用在接收一个新连接之后,会首先发送一大块的数据(2MB)给对端进行初始化,而上层又没有对这2MB的数据进行分块发送,直接放进了output中,output被直接撑大到2MB(应该说起码2MB),这当然没问题,传输一样可以顺利完成,但在数据初始化完毕后,该应用持续发送的都是小包,那么这2MB多的output就被浪费了

万绿丛中一点红,亚马逊中国以慢制乱

主笔:光明

刚刚过去的周末,是让人痛惜的,因为北京的暴雨无情的吞噬了很多同胞的生命。水火无情,生命无价,愿逝者安息。

生命不息,战斗不止。让我们暂时远离暴雨的无情,继续畅谈火热的电商。

 

亚马逊的配送服务策略:慢递

上周的电商热点当属京东的“西红柿门”。不管是有意为之,还是无心插柳,西红柿门都已载入营销炒作的教科书。就在西红柿门余波平之际,亚马逊中国悄悄出招了,推出 “慢递”政策,政策规定:用户在亚马逊中国下单时,若选择货物4—7天配送到家,则可享受该订单额外减少3元的优惠。

MySQL数据库mysql5.5.19版本BUG重现信息与规避技巧(十五)

前一段时间向大家分享了MySQL5.5.19的部分bug,现在继续发布MySQL数据库相关BUG信息。

前文链接:

MySQL数据库mysql5.5.19版本BUG重现信息与规避技巧(一)

MySQL数据库mysql5.5.19版本BUG重现信息与规避技巧(十四)

 

MySQL5.5安装bug总结:

1.MySQL安装在Linux下问题较少,其它平台较多一点;

2.这方面的bug一般不会直接影响生产环境的运行,只是可能会消耗管理人员的时间和精力。

MySQL多线程同步MySQL-Transfer介绍

一、关于Transfer

MySQL-Transefer(下称Transfer)是一个基于MySQL+patch后得到的主从同步工具。
其主要目的是为了解决原生版本的主从同步里,从库是单线程apply主库的binlog,导致的延迟。

最近完成测试的版本将multi-master (by P.Linux)合并到Transfer中并针对支付宝的应用需求做了定制性能改进。

这里做一个已经完成的完整功能介绍。

Chaos网络事件库开篇介绍(一)

Chaos是一个基于Linux平台, c++开发的reactor模式的网络事件库, 目前仅支持TCP传输协议, 仅在x86_64下编译, 并遵循3-clause BSD开源协议. 在使用上, 可以说它很像boost asio, 可能是由于我对boost asio的接口设计很有爱吧, 而且对于boost asio在异步编程方面的思想, 我个人也比较认同, 但至今我也没有仔细阅读过boost asio的源码, 一是boost的模板化编程在可读性上让我比较折磨, 其二则是不想在对设计先入为主的情况下去开发chaos, 很多事情只有我们自己亲自去思考, 才能有所收获.

 

进入主题, 关于chaos库源码和所有测试用例和应用服务, 都可在https://github.com/lyjdamzwf/chaos 下载

提升网站用户体验的七个妙招

主笔:光明


师者,传道、授业、解惑也。古者称师为先生,十年树木,百年树人,行业要进步,先生多多益善。

自觉学识尚浅,还远未达到先生的高度,但希望尽自己微薄之力,力所能及的做一些解惑工作。起步就从“网站运营”开始。

最近在微博里回复了几个朋友的咨询,挑选其中一个有代表性的问题,在博客里做个展开说明分享。