草庐IT

稳定支撑千万级月活,华为日历背后的英雄

华为云开发者社区 2023-03-28 原文
摘要:华为日历月活高达数千万,这使其对支撑业务的数据库提出了巨大挑战:高并发场景下,数据库如何实现快速扩容?海量数据运行,如何确保业务稳定性?

本文分享自华为云社区《稳定支撑千万级月活,华为日历背后的英雄》,作者: GaussDB 数据库。

随着科技进步,手机日历早已融入我们的生活,不仅可以记录时间、提醒重要日程和重要纪念日,还可以推荐星座信息、历史趣事、体育赛事等。

华为日历就是这样一款人性化的App,不仅功能全面、内容丰富,还提供了个性化功能,使用者可以根据个人习惯设置信息订阅管理,极大提升了用户的体验感。

华为日历背后的技术支持

我们知道,任何一款App,在运行时都将产生大量的数据,这时就需要一款大容量的数据库来支撑。而数据库也并不是仅仅能存数据就行,最重要的是能够满足这个App的特殊要求,例如存取速度、稳定性、高并发等。

华为日历月活高达数千万,这使其对支撑业务的数据库提出了巨大挑战:高并发场景下,数据库如何实现快速扩容?海量数据运行,如何确保业务稳定性?

这不得不提华为日历背后的英雄——华为云云原生数据库GaussDB(for Cassandra)。

为什么是GaussDB(for Cassandra)?

华为云GaussDB(for Cassandra) 是一款兼容Cassandra生态的云原生NoSQL数据库,支持类SQL语法CQL。在华为云高性能、高可用、高可靠、高安全、可弹性伸缩的基础上,提供了一键部署、快速备份恢复、计算存储独立扩容、监控告警等服务能力,满足华为日历对数据库的要求,就拿上面的赛事查询场景来说:

  • 数据响应及时。华为日历当中的很多功能,例如赛事信息、重大事件,突发事件等,对实时性的要求很高,要求能够快速地写入和读取。
    作为一款NoSQL数据库,GaussDB(for Cassandra)相比于传统关系型数据库,在面对海量数据的高并发读写场景,具有得天独厚的优势,其独特的水平扩展能力,极强的分布式架构,通过将压力分散到不同的节点,有效地解决了高负荷下的性能瓶颈问题,满足了业务海量数据高并发读写需求。
  • 轻松应对高并发。华为日历的用户群体巨大,同一时间可能会有很多人查询当天的赛事信息,或者会有很多人添加他们的日程表。而这些,正是GaussDB(for Cassandra)的优势所在,因为GaussDB(for Cassandra)就是为了互联网而生。
    GaussDB(for Cassandra)支持高并发,读写性能优异,而且其采用分布式架构,灵活性高,相比于原生的Cassandra,GaussDB(for Cassandra)的性能提升在2倍以上,能够完全满足华为日历的业务场景需求。
  • 极致的可靠性。对于数据库来说,我们不仅要保证它能够胜任海量数据高并发读写这样的要求,可靠性也是我们追求的目标之一。

GaussDB(for Cassandra)不仅在读写性能上优势突出,在数据的可靠性上也表现优异。由于GaussDB(for Cassandra)采用多节点分布式架构,任意盘或节点故障,读写操作会自动切换到其他节点,理论上可以达到N-1个节点故障容忍,即集群任意一节点存活就可以提供完整服务。

GaussDB(for Cassandra)的突出优势

GaussDB(for Cassandra)在兼容原生Cassandra的基础上,具有安全可靠、超强读写、弹性扩展、便捷管理等特点。通过VPC、子网、安全组、SSL加密传输以及细粒度权限控制等多层安全防护体系,完美地保护了数据库和用户的隐私。

同时,华为云GaussDB(for Cassandra)采用基于计算存储分离的分布式架构,能够实现分钟级别的计算节点扩容和秒级别的存储扩容,保证了扩容过程不干扰线上业务,具备极强的弹性扩展能力,及时应对突发流量。

此外,华为云GaussDB(for Cassandra) 还提供可视化的实例管理平台,可以很便捷地对实例进行创建、删除、备份恢复,以及删除和增加节点,而且一键操作即可。

GaussDB(for Cassandra)的上线效果

在GaussDB(for Cassandra)的支持下,华为日历在保障其数据可靠性的基础上,轻松应对了高并发场景,保障了业务的顺利进行,给每一位使用者带来极大的便利,真正意义上服务了每一位用户。

在华为终端云应用中,GaussDB(for Cassandra)已支撑包含华为日历在内的70+核心手机服务在线稳定运行,总节点数10000+,总数据量XX PB,业务请求每秒千万级

除此之外,GaussDB(for Cassandra)还在很多场景中有着广泛的应用,如个性化推荐(海量数据快速存取、用户行为分析),社交App(点赞、评论、回复)等诸多场景。

尽管如此,上述的场景也只是GaussDB(for Cassandra)的冰山一角,华为云GaussDB(for Cassandra)将持续推出更多新特性,让每个用户都能享受更加稳定、高效的数字化服务。

 

点击关注,第一时间了解华为云新鲜技术~

有关稳定支撑千万级月活,华为日历背后的英雄的更多相关文章

  1. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  2. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  3. 华为常用命令 - 2

    system-view进入系统视图quit退到系统视图sysname交换机命名vlan20创建vlan(进入vlan20)displayvlan显示vlanundovlan20删除vlan20displayvlan20显示vlan里的端口20Interfacee1/0/24进入端口24portlink-typeaccessvlan20把当前端口放入vlan20undoporte1/0/10删除当前VLAN端口10displaycurrent-configuration显示当前配置02配置交换机支持TELNETinterfacevlan1进入VLAN1ipaddress192.168.3.100

  4. ruby - 变量赋值后的 if 语句 - 有多常见? - 2

    我最近与一位同事讨论了以下Ruby语法:value=ifa==0"foo"elsifa>42"bar"else"fizz"end我个人并没有看到太多这种逻辑,但我的同事指出,这实际上是一种相当普遍的Rubyism。我试着用谷歌搜索这个主题,但没有找到任何文章、页面或SO问题来讨论它,这让我相信这可能是一种非常实际的技术。然而,另一位同事发现语法令人困惑,而是将上面的逻辑写成这样:ifa==0value="foo"elsifa>42value="bar"elsevalue="fizz"end缺点是value=的重复声明和隐式elsenil的丢失,如果我们想使用它的话。这也感觉它与Ruby

  5. 华为OD机试真题 C++ 实现【带传送阵的矩阵游离】【2023 Q2 | 200分】 - 2

            所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。

  6. 西安华为OD面试体验 - 2

    西安华为OD面试体验开始投简历技术面试进展工作进展开始投简历去年一整年一直在考研和工作之间纠结,感觉自己的状态好像当时的疫情一样差劲。之前刚毕业的时候投了个大厂的简历,结果一面写算法的时候太拉跨了,虽然知道时dfs但是代码熟练度不够,放在平时给足时间自己可以调试通过,但是熟练度不够那面试当时就写不出来被刷了。说真的算法学到后期我感觉最重要的是熟练度和背板子(对于我这种普通玩家来说),面试题如果一上来短时间内想不出思路就完蛋了。然后由于当时找的工作不是很理想就又想考研了。但是考研是有风险的,我自我感觉自己可能冲不上那个学校,而找工作一个没成可以继续找嘛。本着抱着试试看的态度在boss上投了简历,

  7. ruby - 无论如何要在 REPL 中重新加载修改后的 gem 文件 - 2

    在尝试构建Rubygem(使用Bundler)时,我倾向于使用Bundler提供的REPL测试代码——可通过bundleconsole访问。有什么方法可以重新加载整个项目吗?我最终再次加载单个(更改的)文件以测试新更改。 最佳答案 以下hack适用于我的一个相对简单的gem和Ruby2.2.2。我很想看看它是否适合你。它做出以下假设:您具有传统的文件夹结构:一个名为lib/my_gem_name.rb的文件和一个文件夹lib/my_gem_name/,其中包含任何文件/文件夹结构。您要重新加载的所有类都嵌套在您的顶级模块MyGemN

  8. ruby - 删除指定节点之后的所有节点 - 2

    这个问题在这里已经有了答案:Nokogiri:SelectcontentbetweenelementAandB(3个答案)关闭2年前。我正在从url中抓取文本的div,并想删除具有backtotop类的段落下方的所有内容。我在stackoverflow上看到了一段遍历代码片段,看起来很有希望,但我不知道如何将它合并,所以@el只包含第一个p.backtotop之前的所有内容分区我的代码:@doc=Nokogiri::HTML(open(url))@el=@doc.css("div")[0]end遍历片段:doc=Nokogiri::HTML(code)stop_node=doc.css

  9. ruby - 如何进行稳定排序? - 2

    如何稳定地对数组进行排序?我要排序的值可能有很多重复项,我不确定ruby​​使用哪种排序算法。我认为插入排序最适合我。示例:a=[[:a,0],[:b,1],[:c,0],[:d,0]]a.sort_by{|x,y|y}#=>[[:a,0],[:d,0],[:c,0],[:b,1]]寻找[[:a,0],[:c,0],[:d,0],[:b,1]] 最佳答案 把你原本想排序的键和索引放到一个数组中,然后排序。a.sort_by.with_index{|(x,y),i|[y,i]}#=>[[:a,0],[:c,0],[:d,0],[:b,

  10. ruby - `+` 在 `*` 之后的含义,当后者在正则表达式中用作量词时 - 2

    今天我遇到了下面的正则表达式,想知道Ruby会用它做什么:>"#a"=~/^[\W].*+$/=>0>"1a"=~/^[\W].*+$/=>nil在这种情况下,Ruby似乎忽略了+字符。如果这是不正确的,我不确定它在做什么。我猜它没有被解释为量词,因为*没有转义并且被用作量词。在Perl/Ruby正则表达式中,有时当一个字符(例如,-)在不能被解释为特殊字符的上下文中使用时,它会被视为文字。但如果在这种情况下发生这种情况,我希望第一个匹配失败,因为左值字符串中没有+。这是对+字符的巧妙正确使用吗?以上行为是错误吗?我是否遗漏了一些明显的东西? 最佳答案

随机推荐