像反向代理,负载均衡,静态化,缓存,数据库分区这些就不具体说了,主要是业务系统的设计,整个系统基于soa,主要设计如下
1 前端页面发送请求,调用后台服务模块webservice
2 服务模块api接受到请求,将接受的数据封装成map,调用后台交易模块webservice
3 交易模块api将封装的map再次封装成一个event,放入交易Disruptor队列
4 交易模块主线程从交易Disruptor队列中取出event,分析event的数据,进行处理,比如对于买票请求
a.读取票池内存数据或内存数据库,查看是否有票
b.如果没票,则返回出票失败
c.如果有票,则将票池票数降1,将event状态设为支付中,放入支付网关Disruptor队列,返回支付中
d.支付网关模块主线程从支付网关Disruptor队列中取出event,进行处理
e.当支付完成时,支付网关主线程将event状态设为支付成功或支付失败,重新放入交易Disruptor队列
f.交易模块主线程从交易Disruptor队列中取出event,如果状态是支付成功,则返回出票成功,如果状态是失败,则票池票数加1,返回支付失败
核心思想就是把处理串行化,除此之外,在这个系统中,还有一些需要特殊设计的地方
1 在系统启动时,将从核心票务数据库读取数据,构造票池内存数据结构,这样,在实际的业务中,就不再从物理数据库中读取数据,极大提高性能
2 票池内存数据结构是个高度优化的数据结构,方便快速的读取和修改
3 当系统发生故障时,快速的恢复是必须的,因此,每个event在放入队列前,都要先保存,可以保存到key-value类型的数据缓存系统中
4 交易系统和支付网关系统的的主线程也要采取双线程监听,一旦主线程发生故障,立刻启动备用线程
5 交易模块主线程执行的是一个个严格串行执行的任务,这样就确保了对处理的内存资源不需要进行加锁
6 支付网关模块主线程执行的是一个个需要等待较长时间的任务,这些任务都是调用支付服务商的api进行支付,等待返回支付结果,这些任务互不相关,可以并行处理, 因此可以采取异步计算的job-worker结构
作者:lijianhua1974 发表于2013-2-7 11:45:33
原文链接