同步并发与异步并行
你在那里苦苦等待,等来的却不是你要的结果
最近几天由于市场的疯狂,系统中各种隐藏的问题开始爆发,这些问题或多或少都与同步并发有关。
同步并发系统有两大痼疾
- 线程池和连接池是典型同步并发:每收到一个请求,从池中取出一个线程处理业务逻辑,直到业务完成才归还线程。为了提高并发量,线程池中的线程数增加,但是线程数增加,首先占用资源大,其次业务处理过程中需要用同步锁保护数据,同步锁访问导致线程上下文切换,成为并发量的瓶颈。这个瓶颈的存在,由于系统访问量的突发高峰,系统的容量的问题便爆发了。
- 更严重的问题是,由于关键数据没有同步引起的并发逻辑问题。当今的系统,几乎都是分布式的,要想在多线程,多进程甚至多服务器并发节点间保证数据同步何其艰难,任何一个数据操作发生竞争,都将导致系统逻辑上出现错误,这种错误如果涉及到交易和账户将导致无法挽回的灾难。
以上两个问题,在市场疯狂的时候同时爆发,这——不仅仅是巧合。解决的方案唯有异步并行。
异步并行的系统,使用自解释、自包含的消息承载数据,每一个节点的业务只需要根据消息内容即可处理,无需再访问共享数据。于是多线程,多进程,多服务器节点间无需同步,各自并行处理。
回调不是真正的异步。回调需要在现场保存状态,既然存在状态就可能由于竞争而导致不一致。只有消息驱动的系统才是真正的异步。