同样是高并发,社交通讯/微博/12306的架构难度一样吗?

简介: 高并发的扣款场景,可以使用CAS乐观锁,采用select&set方式进行扣款,既能够保证吞吐量,又能够保证一致性。

开篇同一个用户并发扣款时,有一定概率出现数据不一致,可以使用CAS乐观锁的方式,在不降低吞吐量,保证数据的一致性:

UPDATE t_yue SET money=$new_money

WHERE uid=$uid AND money=$old_money;

不能采用直接扣减的方式:

UPDATE t_yue SET money=money-$diff WHERE uid=$uid;

当然,更通用的方式,可以使用版本号来实现CAS乐观锁:

UPDATE t_yue SET money=$new_money,ver=$ver_new
WHERE uid=$uid AND
ver=$ver_old;


对于这个CAS乐观锁方案,很有朋友有疑问:
当并发量高时,版本号比对会导致大量的更新失败,这个方案不适用于高并发场景吗?   究竟是不是这样呢? 大家对高并发是不是有什么误解呢? 今天来聊一聊这个话题。

先分析三个业务场景。
  一、社交通讯 社交通讯的一些核心业务有:
  • 个人:user(uid, user_info, …)

  • 好友:user_friends(uid, friend_id, …)

  • 加入的群:user_groups(uid, group_id, …)

  • 群:group(gid, group_info, …)

  • 群成员:group_members(gid, uid, …)

  • 个人消息:msgs_user(msg_id, uid, …)

  • 群消息:msgs_group(msg_id, gid, …)

  这些信息的读写有一个特点,都会带上uid/gid/msgid属性。   例如,拉取好友列表

select friend_id from user_friends where uid=$uid;

  在用户量很大,并发量很大时, 不同用户/群/消息数据的读写并没有锁冲突 画外音:10W个用户同时读写,彼此没有锁冲突。   只有当,同一个用户,很短的时间内,有大量并发时,才可能存在锁冲突。 画外音:例如,1个用户,1秒钟读写1W次。   二、微博 微博的核心业务是feed流:
  • 发消息,写操作

  • 刷消息,读操作

  微博业务显然是 读多写少 的,在用户刷消息时, 自己feed流里的消息,是由别人发出的   查看自己主页feed流 ,最朴素的实现方法是: (1) 拉取自己关注的用户id_list; (2) 拉取这些用户最近N条消息; (3) 将这N*id_list条消息排序; (4) 返回第一页消息,得到自己主页feed流;

在用户量很大,并发量很大时,会有一定数据的读写锁冲突

画外音:不像社交通讯,基本是读写自己的数据,微博要写自己的数据,读别人的数据。   三、12306 12306的核心业务是:
  • 查票,读操作

  • 买票,写操作

 

stock(id, num) // 某一列车有多少张余票

  在用户量很大,并发量很大时, 有极大的锁冲突 画外音:这个业务,数据量并不大。   这类“秒杀”业务,如果不做特殊的优化, 数据库很容易死锁卡死 ,没有任何人能买票成功。 画外音:要做什么特殊的优化呢?   收尾 社交通讯,微博、12306,同样是高并发业务,就数据存储锁冲突来说,各自的难度,数据不一致的概率是不同的。 画外音:你不能说,社交通讯不是高并发业务吧。   回到开篇,使用CAS乐观锁进库存扣减:

UPDATE t_yue SET money=$new_money,ver=$ver_new
WHERE uid=$uid AND
ver=$ver_old;

只要有uid这个过滤属性,即使10W用户同时扣款,也不容易出现数据不一致   只有当同一个用户,同一秒钟,有大量扣减时,才有一定几率会冲撞,但也不会导致数据不一致。 画外音:有一位很可爱的水友,说万一PC端和APP端同时下单怎么办。   结论
高并发的扣款场景,可以使用CAS乐观锁,采用select&set方式进行扣款,既能够保证吞吐量,又能够保证一致性。

本文转自“架构师之路”公众号,58沈剑提供。

目录
相关文章
|
30天前
|
消息中间件 架构师 数据库
本地消息表事务:10Wqps 高并发分布式事务的 终极方案,大厂架构师的 必备方案
45岁资深架构师尼恩分享了一篇关于分布式事务的文章,详细解析了如何在10Wqps高并发场景下实现分布式事务。文章从传统单体架构到微服务架构下分布式事务的需求背景出发,介绍了Seata这一开源分布式事务解决方案及其AT和TCC两种模式。随后,文章深入探讨了经典ebay本地消息表方案,以及如何使用RocketMQ消息队列替代数据库表来提高性能和可靠性。尼恩还分享了如何结合延迟消息进行事务数据的定时对账,确保最终一致性。最后,尼恩强调了高端面试中需要准备“高大上”的答案,并提供了多个技术领域的深度学习资料,帮助读者提升技术水平,顺利通过面试。
本地消息表事务:10Wqps 高并发分布式事务的 终极方案,大厂架构师的 必备方案
|
2月前
|
缓存 关系型数据库 MySQL
高并发架构系列:数据库主从同步的 3 种方案
本文详解高并发场景下数据库主从同步的三种解决方案:数据主从同步、数据库半同步复制、数据库中间件同步和缓存记录写key同步,旨在帮助解决数据一致性问题。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
高并发架构系列:数据库主从同步的 3 种方案
|
2月前
|
缓存 负载均衡 网络协议
高并发架构的CDN知识介绍
本文详细介绍了网络请求过程,特别是大型网站架构中DNS和CDN的作用。通过一张常用架构图,文章解释了从客户端请求到服务器响应的全过程,包括DNS解析、负载均衡、CDN加速等关键环节,帮助读者深入了解高并发架构的设计原理和优化方法。
130 1
|
3月前
|
缓存 NoSQL Java
秒杀圣经:10Wqps高并发秒杀,16大架构杀招,帮你秒变架构师 (1)
高并发下,如何设计秒杀系统?这是一个高频面试题。40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试Shopee时遇到了这个问题,未能很好地回答,导致面试失败。为此,尼恩进行了系统化、体系化的梳理,帮助大家提升“技术肌肉”,让面试官刮目相看。秒杀系统设计涉及16个架构要点,涵盖业务架构、流量架构、异步架构、分层架构、缓存架构、库存扣减、MQ异步处理、限流、熔断、降级、存储架构等多个方面。掌握这些要点,可以有效应对高并发场景下的秒杀系统设计挑战。
秒杀圣经:10Wqps高并发秒杀,16大架构杀招,帮你秒变架构师 (1)
|
5月前
|
存储 缓存 负载均衡
高并发系统架构的设计挑战与应对策略
【8月更文挑战第18天】高并发系统架构设计是一项复杂而重要的任务。面对性能瓶颈、稳定性与可靠性、并发控制和可扩展性等挑战,开发人员需要采取一系列有效的策略和技术手段来应对。通过负载均衡、缓存技术、数据库优化、异步处理、并发控制、弹性设计及监控与调优等手段,可以设计出高性能、高可用和高可扩展性的高并发系统架构,为用户提供优质的服务体验。
|
6月前
|
开发者 Sentinel 微服务
高并发架构设计三大利器:缓存、限流和降级问题之降级策略中的有限状态机的三种状态切换的问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之降级策略中的有限状态机的三种状态切换的问题如何解决
|
6月前
|
监控 应用服务中间件 nginx
高并发架构设计三大利器:缓存、限流和降级问题之Nginx的并发连接数计数的问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Nginx的并发连接数计数的问题如何解决
|
6月前
|
应用服务中间件 nginx 缓存
高并发架构设计三大利器:缓存、限流和降级问题之Nginx作为前置网关进行限流问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Nginx作为前置网关进行限流问题如何解决
|
6月前
|
监控 算法 Java
高并发架构设计三大利器:缓存、限流和降级问题之配置Sentinel的流量控制规则问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之配置Sentinel的流量控制规则问题如何解决
|
6月前
|
监控 Sentinel 缓存
高并发架构设计三大利器:缓存、限流和降级问题之RateLimiter的acquire()方法有什么作用
高并发架构设计三大利器:缓存、限流和降级问题之RateLimiter的acquire()方法有什么作用

热门文章

最新文章