网络安全,互联网金融,高并发

转载自:http://m.zhihujingxuan.com/26957.html

推出一款互联网金融理财产品,如何安全高效的处理用户高并发的购买请求?

2015-10-06 20:00:09来源:知乎精选

 

【梁川的回答(17票)】:

此类问题比较类似电商网站的秒杀/抢购、微信抢红包。

此类业务一般都涉及分布式系统。而对于分布式系统而言,由于所谓的CAPS理论:服务的可用性、可靠性、数据的一致性三个要素并不能同时满足,因此一般都遵循所谓的BASE理论。

CAP理论:

Consistency:一致性, 数据一致更新,所有数据变动都是同步的

Availability:可用性

Partition tolerance:分区容错性,系统可靠性

BASE理论:

Basically Available:基本可用

Soft-state:软状态/柔性事务

Eventual Consistency:最终一致性

因此依赖于不同的场景,大家的处理方式不尽相同。

例如像微信红包,发放的红包是可以没被抢到的。而秒杀、抢购一般会被抢光。

又比如像小米抢购手机,由于其限量的手机台数是小米自己定义的,抢购的手机台数可以有一定程度的误差的(多或少一点)。而对于淘宝秒杀、抢购一般要求保证不多也不少。

在具体使用场景上,互联网金融的投标过程更类似于电商的秒杀和抢购。

此类应用重点要解决如下一些问题:

1、超卖

例如融资金额为1000万,在最后的抢购中,可投金额只剩下1万元,可能会有多个投资者同一瞬间都投标成功,导致用户投资的金额超过了融资额。

解决超卖问题的方案是保证用户投标过程,对投资金额的增减采用事务,且要保证事务操作的原子性。

2、少卖

典型场景题主提到了:用户投标抢到了,但因支付失败等原因没正常完成抢购到订单支付。

解决少买问题的方案是对抢购订单设定时效性,定时对超过时效未支付的订单释放掉。

3、刷单作弊

例如黄牛采用批量注册多个账户并用多账户并发抢购、用秒杀工具(按键精灵/autohotkey、触摸精灵、phantomjs、selenium等)或自行开发的工具抢购、变换IP地址(例如ADSL、代理服务器) 来抢购。

解决办法一般采用限制同一账户并发请求数、验证码、token、IP地址限制、账户黑名单等方式。

4、服务器过载保护

解决办法一般采用服务降级、限流。可以参考微信红包的思路: 有损服务,柔性可用,大系统小做。谈谈微信红包海量运营--发10亿个红包难在哪里?

5、外部渠道的瓶颈

类似秒杀、抢购、抢红包这样的活动,外部最大的瓶颈在于支付渠道。

支付渠道的瓶颈主要分为两大类:

第一类:第三方支付平台的稳定性、流量瓶颈、系统并发性能等

第二类:某个银行渠道本身稳定性和流量瓶颈,例如使用工行卡支付的占比过高,导致工行流量过载。

解决办法:

对支付渠道的稳定性及流量瓶颈,可以多接入几家第三方支付或直连银行,在多家支付渠道将备份容灾、分流。

对银行渠道的稳定性及瓶颈,第三方支付一般会在同一家银行的多个接口做渠道路由及分流。

另外在产品层面,除了实时秒杀/抢购外,可以考虑预约、引导用户提前进行账户充值使用账户支付的方式。

6、网络、服务器及硬件设备容灾

例如网络瘫痪、服务器瘫痪、网卡、存储出问题之类。

解决办法一般采用系统升级扩容(水平扩展、垂直扩展)、容灾、备份等。

7、性能

在性能上,常规的CDN、页面静态化、数据库读写分离、缓存、异步化(消息队列)、柔性事务等方案都可以用上。

这里重点说一下超卖问题,超卖问题的本质善于高并发情况下数据库事务瓶颈的技术解决办法。

超卖问题有两种方案:

a、采用数据库事务ACID来保证

如果使用的mysql,可以采用mysql的线程池技术,通过请求排队及请求合并,提高数据库事务并发处理能力。

由于在秒杀这样高并发的事务处理情况下,数据库由于死锁检测等因素性能直线下降。

具体可以参考淘宝在秒杀业务的解决方案:秒杀场景下MySQL的低效--原因和改进l

淘宝是采用修改mysql源代码方式来定制的,开源方案可以参考MariaDB的thread_pool系列参数,尤其是thread_pool_oversubscribe参数。

可以参考:秒杀应用的MySQL数据库优化

此种方式的思路适合于需要完全保证ACID的场合,像支付系统核心交易、账户、账务。

b、采用redis+mysql结合的方式

由于redis本身的高性能,可以将投资总金额及余额存放在redis,用redis完成投资用户的抢购排号,然后通过消息队列或日志同步(例如kafka)方式将数据同步到mysql中。

为保证redis操作原子性,建议采用redis lua脚本在redis服务器端完成总的投资金额/余额的操作。

此种方式可能存在如下两个问题:

redis与mysql数据同步延迟问题:可以在用户取号后,等待几秒,保证消息队列或日志同步到mysql。

redis瘫痪问题:通过限流等方式避免redis过载,通过redis集群保证redis高可用性。

网上关于微信红包、电商网站的秒杀架构讨论比较多,以下几篇文章值得参考。

谈谈微信红包海量运营--发10亿个红包难在哪里?

双十一数据库核心技术

京东商城双十一技术实战 -PPT-腾讯大讲堂

小米网抢购系统的设计经验

微信红包

【技术篇】——如何为红包提供稳定支付体验

微信红包系统设计 & 优化

微信红包

【技术篇】——如何在服务有损的情况下保证用户体验

原文地址:https://www.cnblogs.com/lhws/p/4991992.html