`

同样是高并发,QQ/微博/12306的架构难度一样吗

阅读更多

开篇

同一个用户并发扣款时,有一定概率出现数据不一致,可以使用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乐观锁方案,很有朋友有疑问:当并发量高时,版本号比对会导致大量的更新失败,这个方案不适用于高并发场景吗? 究竟是不是这样呢?大家对高并发是不是有什么误解呢?今天来聊一聊这个话题。

先分析三个业务场景。

一、QQ

QQ的一些核心业务有:

  • 个人: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流;

 

画外音:这里不展开读扩散,写扩散,在用户量很大,并发量很大时,会有一定数据的读写锁冲突。

 

 

画外音:不像QQ,基本是读写自己的数据,微博要写自己的数据,读别人的数据。

 

 

 

三、1230612306的核心业务是:

  • 查票,读操作

  • 买票,写操作

 

 

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

 

在用户量很大,并发量很大时,有极大的锁冲突。

 

画外音:这个业务,数据量并不大。这类“秒杀”业务,如果不做特殊的优化,数据库很容易死锁卡死,没有任何人能买票成功。

 

画外音:要做什么特殊的优化呢?

 

 

收尾

QQ,微博、12306,同样是高并发业务,就数据存储锁冲突来说,各自的难度,数据不一致的概率是不同的。

 

画外音:你不能说,QQ不是高并发业务吧。

 

 

回到开篇,使用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方式进行扣款,既能够保证吞吐量,又能够保证一致性。

 

欢迎关注公众号:“Java架构师学习”

 

你会喜欢的!

 

 

0
0
分享到:
评论

相关推荐

    ThinkPHP框架开发仿糗事百科笑话系统PHP源码/包含6套PC端模板/1套WAP手机端模板+积分商城+QQ/微博登录

    ThinkPHP框架开发仿糗事百科笑话系统PHP源码_包含6套PC端模板+1套WAP手机端模板+积分商城+QQ/微博登录 内涵段子等笑话网站系统源码,主要是基于ThinkPHP3.2.3框架开发仿糗事百科笑话系统PHP源码,包含6套PC端模板,...

    友盟分享集成QQ/微信/微博的自定义面板分享

    友盟作为一个提供社会化分享服务的平台,为开发者提供了方便地集成QQ、微信、微博等主流社交应用的分享功能。本文将详细介绍如何使用友盟SDK实现自定义面板的分享功能。 首先,你需要在友盟官网注册一个开发者账号...

    Erphplogin Pro QQ登陆/微博/微信登录/弹窗登录 – WordPress登陆插件

    Erphplogin Pro是一款wordpress网站用户通过QQ、微博、微信扫码以及弹窗来进行登录的wordpress中文插件。 微信登录的接口是微信开发者平台的接口,扫码登录。 本插件不仅实现了社交登录功能,还有弹窗登录功能(由于...

    SSM对第三方登陆(QQ/微信/Github/微博/开源中国/人人网/豆瓣/百度)进行整合

    本教程重点讲解如何在SSM项目中集成第三方登录服务,包括QQ、微信、GitHub、微博、开源中国、人人网、豆瓣和百度等。这些社交平台提供的OAuth2.0协议允许应用安全地获取用户信息,实现单点登录(SSO)功能,极大地...

    带微信/微博二维码的jQuery网页浮动在线QQ客服代码

    在本文中,我们将深入探讨如何使用jQuery实现一款带有微信和微博二维码的网页浮动在线QQ客服代码。这款代码设计精美,实用性高,适用于当前社交媒体广泛使用的环境。然而,需要注意的是,该代码默认仅支持设置一个QQ...

    搜酷狗微博 1.0.04.11.rar

    [搜酷狗微博]-首次提供公测(Tsokugo micro-Bo Ver 1.0.04.11),从现在开始您就可以关注我的微博啦!水岸心晴设计工作室,首次免费提供个人微博系统。 功能包括: 1、图片上传/图片缩略图/图片水印自动生成/网络...

    QQ微博 一键登录

    2. **微博登录API**:类似于QQ,新浪微博也提供了OAuth 2.0授权服务。开发者需在微博开放平台注册应用,获取App Key和App Secret。用户授权后,应用可以通过API获取到用户的唯一标识符UID,以便进行后续操作。 3. *...

    微博项目文档

    本微博类似一个交友的平台,用户可以通过微博发表一个即使短信息,让自 己的朋友对自己当前的心情或其他各方面有所了解,此短信息就像是QQ空间中发表的心情。用户还可以通过此微博搜索好友,添加关注好友。

    分享到QQ/微信/微博/人人网

    源码openshare,楼主做iOS开发的过程中遇到这样的问题:自己app中的信息需要分享到QQ、微信、微博等社交网络。现在的客户端越做越强大,直接集成了分享功能,比如用户手机上安装了微信,只需要app调起微信,并且给...

    实现分享信息到QQ/微信/微博

    微信,QQ登录认证也都能工作,唯独微博的登录认证没跑通,因为没有去注册应用,不过登录认证的界面是调起来的了。 支付相关代码也都翻译完了,但由于没有相应的服务端,所以这两个都没有跑通。

    千寻QQ社区-QQ微博转发软件

    9. **更新与维护**: 高质量的软件会定期更新,修复问题,添加新功能,以适应QQ微博的更新变化。 总结:千寻QQ社区-QQ微博转发软件是一款专为QQ微博设计的自动化工具,其核心功能是帮助用户快速转发微博,可能包含...

    html分享到新浪 QQ好友 QQ空间 腾讯微博

    html分享到新浪 QQ好友 QQ空间 腾讯微博

    微博短视频百万级高可用、高并发架构如何设计

    ### 微博短视频百万级高可用、高并发架构设计 #### 一、业务场景与挑战 微博短视频(微博故事)面临着独特的业务挑战:一方面需要处理不可预见的突发流量暴涨,如明星绯闻、爆炸性新闻等事件导致的瞬间流量激增;...

    Flutter 截图、QQ分享、微信分享、微博分享

    Flutter,作为Google推出的一种跨平台开发框架,以其高性能、高效率和丰富的UI库深受开发者喜爱。本文将深入探讨如何在Flutter应用中实现截图、QQ分享、微信分享以及微博分享的功能。 **截图功能** 在Flutter中,...

    腾讯QQ微博分享

    【腾讯QQ微博分享】是腾讯公司提供的一项服务,允许用户通过QQ平台将内容分享到微博上,扩大信息的传播范围,提升社交互动性。这项功能的实现离不开特定的开发工具和接口,通常由软件开发工具包(SDK)来提供。 ...

    网页分享插件,可以实现微信、QQ、微博分享

    网页分享插件是一种常见的工具,尤其在现代互联网环境中,它为用户提供了一种便捷的方式,将网页内容快速地分享到各种社交媒体平台,如微信、QQ和微博。本插件的标题和描述表明,它专为PC端和H5(HTML5)网页设计,...

    qq和新浪微博授权登陆

    QQ和新浪微博授权登录是互联网应用中常见的用户身份验证方式,特别是在移动端。这两种授权登录机制允许用户使用已有的QQ或微博账号快速注册并登录其他第三方应用,简化了用户的账户管理流程,同时也为开发者提供了...

    jQuery手机端QQ微信微博分享插件

    《jQuery手机端QQ微信微博分享插件:实现社交平台无缝分享》 在当前互联网时代,社交媒体已经成为人们日常生活的一部分,分享内容到微信、QQ、微博等平台已成为习惯。为满足这一需求,开发人员利用jQuery库创建了一...

    微博登录 QQ登录 分享

    "微博登录"和"QQ登录"是两种常见的第三方登录方式,它们为用户提供了一种快速便捷的注册和登录体验,而"分享"则进一步增强了用户的参与度和应用的传播力。下面我们将详细探讨这些知识点。 首先,我们来看"微博登录...

    QQ微博登录步骤

    QQ微博是中国腾讯公司推出的一款社交媒体服务,用户可以通过QQ账号进行登录并分享动态、关注他人、参与讨论等。本文将详细解析QQ微博的登录步骤,并探讨其中涉及的技术原理和相关工具。 首先,QQ微博的登录过程通常...

Global site tag (gtag.js) - Google Analytics