• Feeds

  • 微信红包金额分配的算法

    虽然春节已经过去一段时间,但不少微信群里面依旧乐此不疲的在玩发红包活动,用户自发的将最初的一个春节拜年的场景功能慢慢演化成一个长尾功能。

    用户在微信中抢红包时分成抢包和拆包两个操作。抢包决定红包是否还有剩余金额,但如果行动不够迅速,在拆包阶段可能红包已经被其他用户抢走的情况。

    红包的金额是在什么时候算? 据某架构群腾讯财付通专家反馈,红包的金额是拆的时候实时计算,而不是预先分配,实时计算基于内存,不需要额外存储空间,并且实时计算效率也很高。每次拆红包时,系统取0.01到剩余平均值*2之间作为红包的金额。

    为了保证每次操作的原子性,拆包过程中使用了CAS,确保每次只有一个并发用户拆包成功。拆包CAS失败的用户可以由系统自动进行重试。但也有可能在重试过程中被别的用户抢得先机而空手而归,因此严格意义拆包的调用也未能保证用户先到先得。

    基于上面的原因,当时在群中提到这种算法有些复杂,微信红包为了减少存储,每次进行了一个理解稍复杂的实时计算。对比大部分架构师想到的预分配金额的做法,预先分配金额需要将金额保存在一个内存队列中,如果红包的份额较多,则需要较大的存储空间。而微信红包仅保存 count:balance 这样2个数字。count指还剩几个人可以抢,balance只还剩下的金额。

    但是预分配金额也并不是非得需要额外存储。比如利用随机算法,在种子相同的情况下,随机数实际上返回的随机序列也是固定的。如以下Python代码,对于给定的seed 1024,每次执行返回的结果都是相同的。
    >>> import random
    >>> random.seed(1024)
    >>> random.randint(1,100)
    80
    >>> random.randint(1,100)
    49
    >>> random.randint(1,100)
    39
    >>> random.randint(1,100)
    83
    >>> random.randint(1,100)
    88

    因此预分配金额也只需要额外存储一个种子,或利用一些红包id做加密变换做seed达到零存储。而在发放红包时候,无需进行CAS操作,而只需要对剩余红包count做一个DECR操作。当count<0时,表示红包被拆包抢完。由于DECR是原子操作,无需加锁,用简单的方法达到了先拆包先得,原理上不存在早拆包但由于并发冲突失败而抢不到红包的情况。

    每个人分配的金额是:total * random(n) / random_total,不需要重复计算。
    random(1)..random(n)不需要保存,因为对于给定的seed,random(1)到random(n)返回是固定的。

    以上算法评论与对比,与Tim所在雇主的红包算法无关,特此声明。

    部分细节下面列表已做说明,未做详细阐述。

    Reference:
    1、微信红包的架构设计简介
    2、网友周航老师基于聊天记录整理的微信红包架构图(点击查看大图)
    wechat architecture
    3、微信红包实现原理

    对于上文中提到的架构群感兴趣的朋友可以关注Tim公众号“TimYang_net”后回复“arch”获取进群方式。

    出品人眼里的一次QCon技术大会

    上千人的技术大会非常壮观,这次QCon北京全球软件开发大会的参会人数有可能达到了历史新高。考虑到北京国际会议中心会场的容载能力不足,对于参会人员来说,在这次大会中选择听一些热门内容的演讲注定是一次艰苦的历程。演讲开始前如果刚好从别的分会场跑过来,就很有可能堵在门口进不去;坚守一个分会场不转场的同学保留住了席位,但几百人挤在一个会场持续几个小时,感觉离烤肉的距离已差不远。

    本次Tim继续担当了可扩展高可用专题分会场的出品人,可扩展是指软件架构中项目及产品在快速成长的阶段具备很好的扩展及应对能力。而可用性则关注项目在长时间运行以及碰到极端压力的情况下仍然具有较好的稳定性,包括应用柔性可用策略的能力。考虑到国内互联网创业的蓬勃发展,大量的成长型企业会碰到架构瓶颈的问题,前几个月曾经出现一个爆款的app太火,一堆外援的技术专家和云平台去救火的情形。因此预计专题会得到较多的关注,主办方也特意保留了一个较大的分会场并策划了全天的专题内容。跟以往的情况比较类似,考虑到在可扩展及高可用的行业代表性,分享的讲师大多是来自知名的互联网公司,但是在与讲师们准备演讲内容时,Tim会建议讲师将不具有广泛适用性(比如需要依赖大公司自研系统的一些做法)内容去除,让介绍的经验能让大部分参会群体包括初创型企业有较好的借鉴性,方便应用到听众各自的环境。

    由于此专题在历届QCon关注度和评价都不错,也曾经产生过不少互联网界经典的架构案例,因此本次的讲师们也都非常有压力,分享的内容在准备期间就经过多个版本的迭代,比如来自微博的讲师秦迪总结了一篇做一场不被喷的技术分享
    ,其对待分享的态度以及一场让听众满意的分享如何去做值得架构师参考。

    选择是否去参加一场技术大会也是个很痛苦的抉择,不去的话感觉错失了好多信息,尽管这些信息最终会通过社交媒体传到你眼前;去了的话又感觉学习效果还不如坐在书桌前喝着茶静静的看一个网上的演讲视频。当参会者选择艰苦的到达会场参会,通常希望能得到一些启发及经验,并进一步应用到自身的工作中,参会者把这些具有很强启发及可借鉴性的经验称为“干货”。由于资讯高效传播的特性,要做到这一点实际上越来越难。大公司中或者国外一些具有广泛借鉴意义的方法一经出现,就会迅速被各种技术媒体及技术大V在行业内传播,捂着一个好方法到某个技术大会再揭秘这种可能是非常低,讲师要将分享打造成一场受欢迎的演讲挑战越来越大,大多情况讲师介绍的内容属于大家日常通过网络可获取到的知识。

    尽管获得满意“干货”的机会不好保证,但最近几年参会的人员越来越多。思考其原因,技术大会越来越类似电影行业,技术大会的主角是各种技术大拿,还有幕后出谋划策的策划编辑及专题出品人;电影也是由导演、演员及剧本决定。由于观众的审美品位越来越高,相同的题材出现一次后就不太好再次重演,因此导演和技术大会的策划都在挖空心思寻找观众感兴趣的题材。从理性角度,如果在电影院碰到满意的的电影可能越来越低的情况,观众会减少去看电影。但在事实上,未得到满足的是观众还是一次次乐此不疲走进电影院。技术大会也越来越多的表现出这种倾向。

    也许,相比于其他获得启发的方式,观众就是喜欢这种通过现场感和全心身投入相应主题的专注感来获得思考及满足。一周前打包的slides放在网上(或躺在硬盘的角落)无人问津,赶2小时的地铁去看一场现场分享的事情却乐此不疲。

    一些人确实通过现场学到了一些新知识;另外一些人在体验不佳时候则选择更多通过大会去找大牛瞻仰或切磋、与很久没见到的同行交流等,当然也有抱着单一目的去认识更多牛人的。因此不少技术大会也被戏称程序员的线下社交平台。但是社交只是一个伴随物,经常出现在社区或者技术大会上,每个人都跟你有点头之交,但没有人想到跟你探讨专业问题,沉迷于交际的价值会非常有限。

    从讲师的角度,大部分讲师具有不错的行业代表性,但也不排除一些讲师是为了存在感而参与。一类讲师是有了非常满意的素材并且受邀才会出现在分享的讲台上;而也有一类讲师是先报名则去慢慢找演讲的题材,这种情况就表现出更多宣传及表达存在感的诉求。不过这两种例子都极端一些。

    (EOF)

    最后如果你是一位架构师或首席工程师,并且很愿意参加社区讨论,请了解下面介绍的这个可扩展高可用群的介绍。

    Tim也加入过不少会议群,99%的情形加了一群人之后还没留下一些有效的讨论就无疾而终了,一群缺乏组织的陌生人聚在一起的讨论区通常很难持久下去。在纠结的心情中创建了一个群,周末通过圈子之间的互相邀请目前积累了不少人,也暂时还没有沉寂,并意外的是还输出了一些不错的讨论内容,如这篇WebIM实践过程中可能遇到的问题及总结。这个群欢迎架构师、首席架构师、首席工程师或一线技术负责人加入,潜水的成员会定期清除,有兴趣的可以关注Tim公众号“TimYang_net”后回复“arch”获取群进入方式。

    互联网公司为什么要组织黑客马拉松(Hackathon)


    黑客马拉松(Hackathon)通常是一种连续、集中式的编程活动,由报名人员组队参赛并且在规定的时间内完成计划的功能。黑客马拉松的主力人员是工程师,但产品、设计等人员也可以一起组队参加。“黑客”二字在不同的场合有不同的含义,黑客马拉松中的黑客不是指安全领域里面破坏计算机系统的危险分子;而是那些可以创新性的,通过自己动手编程来扩展、改进现有系统能力的人。

    黑客马拉松通常选择在轻松的环境如咖啡馆进行,有着舒缓的音乐,全天有咖啡、茶、软饮供应;没有叮叮的座机铃声,工程师也不会碰到有人过来催进度加需求的情况。由于目标明确,为了按时完成项目,队员也会避免进行聊天、浏览新闻等分散精力的事情,精神非常集中。周围的人也全都在讨论改进项目的方法,或者是在全神贯注的开发,也给参与人员强烈的环境暗示,“我在这里能够愉快的、高效的进行创作。”

    不过这种集体高潮的活动除了自娱自乐之外,到底有没有价值?这是组织者与参与者经常面临的一个问题。

    首先,任何在公众面前集体曝光的活动不排除有作秀的性质。单纯的集体作秀如果不妨碍他人,属于无伤大雅的脱力系。而适当的团队曝光也有助于公众(包括客户、同事、公司管理阶层)了解参与团队的另一面如创新的能力及高效的执行力,创造机会让队员得到各界更好的了解。一些参赛的项目也可以引发业界从业人员以及投资界的关注,以及进一步思考如何更好的改进相应领域的系统设计来更好的满足用户使用。

    很多黑客马拉松设计成24小时连续进行,看着这些工程师通宵达旦的工作,一些旁观者会觉得不可理解,大部分人平时都不缺几个小时空闲时间,有必要24小时通宵达旦来完成一项功能?它是否仅仅是一个释放工程师多余的荷尔蒙的集体狂欢活动?

    24小时通常是一个自愿的活动,和长跑马拉松同一个道理,有能力有体力的人可以选择性的参加,每个队员可以根据自己的体力情况随时下撤休息,因此并不是旁观者想象的刻意违反人体健康的一个自虐活动。比长跑马拉松更宽松的是,黑客马拉松活动可以休息一段时间并继续进行比赛,它更强调的集中个人的精力来完成一项目标。和长跑马拉松相同的是,队员都会通过这个活动来更好的思考自己的能力、自己能坚持的旅程和自己目标,并且都能很好的享受自己高速迈向目标带来的快感。黑客马拉松创造了一个环境,让队员集中精力集中时间全心身完成一件作品。

    这种做法也非常具有效率,在24小时的活动中,队员可以完成平时一周或者更长时间才能完成的事情,效率达到平时的好几倍。另外通过快速实现自己的想法,可以更好的验证想法是否可行;通过体验做出的原型,可以更好的完善自己的想法,发现自己的不足。有时候,也会帮助我们意识到某条路走不通,更早的来规避失败的方向。所有这些,都可以更早的帮助我们跨过思维停留在idea那一步。

    有些公司将一些封闭式开发的活动或培训也称为黑客马拉松(Hackathon),我觉得区分是否真正意义Hackathon方法是,队员是自由的、主动发挥创意去改进真实世界的问题?还是它是一个被动的、指定的、或假想的任务。不要轻易使用黑客马拉松这个名称,它并不是外围人想象的一个集体狂欢活动,它也未必是一个时髦的标签。如果活动并不具备对自由的崇拜和创新的追求的黑客精神,也没有相应的产出,往黑客马拉松这方面去宣传会让公众及社区感到困扰。

    从公司的角度意义,可以参考facebook黑马组织者Pedram Keyani所说的话,Pedram在7年时间里在Facebook组织了近40场黑客马拉松。

    起初我参加黑马,仅仅是因为我喜欢同大家一起协作,挖掘工作之外的创意,以及产生的能量和自由感。然而随着时间转移,那些黑客马拉松从小小的20人业务活动摇身一变成了Facebook文化的重要组成部分。

    从工程师的角度,Hackathon的意义很大程度是让工程师从工业化的日常任务中脱离出来,回归初心,通过动手打破现实系统的束缚,将创新想法变成现实,让人与计算机的世界变得更好。

    (EOF)

    上一篇选择学习目标的困难与焦虑发表后,各个平台都有不少来询问如何解决的。简单的说下我的看法,每个人自己的学习瓶颈很难由一个同一的方法来解决,这个是我很难写也没有写解决方案的原因;文章更大的目的是让大家意识到自己在学习投入方面的浪费,反思选择的哲学,反思偏表面的学习而轻视思考的哲学,反思为了学习而学习,帮助大家思考更好的前进方法。

    123...Last