小川科技携手阿里云数据库MongoDB:数据赋能企业构建年轻娱乐生态

devtools/2024/10/18 10:26:26/

在这里插入图片描述
随着信息技术的飞速发展,企业在处理海量数据时所面临的挑战日益严峻。特别是在年轻娱乐领域,用户行为的多样性和数据量的激增对数据存储与分析技术提出了更高的要求。在此背景下,小川凭借其前瞻性的技术视野,选择了MongoDB作为其数据存储的核心解决方案,成功构建了一套高效、灵活的数据处理体系。MongoDB作为非关系型数据库的代表,以强大的可扩展性、高可用性以及对复杂数据结构的原生支持,为小川的业务发展提供了坚实的技术支撑。

简介

小川科技有限公司(简称:小川)是一家成立于中国本土的高科技企业,致力于提供信息传输、软件和信息技术服务。公司在互联网服务领域有着广泛的布局,旗下有多款知名的应用程序,比如最右、皮皮搞笑等,注册用户数量达到亿级别。小川所开发的应用程序都专注于年轻人的兴趣,以轻松有趣的内容为主,深受年轻用户的欢迎。

MongoDB在小川的大规模应用

不管是“最右”还是“皮皮搞笑”,从上线之初,小川就选择了MongoDB作为主要存储,目前用到了阿里云和自建MongoDB总共几百套实例,总数据量达数百TB,可以说,真正的核心数据都在MongoDB中。

1.业务架构

在这里插入图片描述

目前在小川的业务架构中,除了少数场景,绝大多数数据都会放在MongoDB中进行管理。

2.小川为什么选择MongoDB
  • ** 灵活的模式设计**
    MongoDB 使用 BSON(类似 JSON 的二进制格式)存储数据,允许不同文档在同一个集合中有不同的字段和结构。 对于快速迭代的开发环境,当数据模型尚未稳定时,这种模式的灵活性尤为有用,极大地提高了团队的开发效率。例如,最右App中帖子服务由于业务需要适应不同终端显示的内容,就可以在同一张表中管理不同结构的数据。

  • ** 高效的查询性能**
    MongoDB 提供了强大的查询语言,支持复杂的查询操作。此外,MongoDB 支持多种类型的索引, 包括单字段、复合、文本、和地理空间索引,可以显著提高查询性能。例如,最右App中有个纸飞机服务需要获取位置信息,就用了空间索引功能。

  • ** 嵌套文档和数组支持**
    小川的许多场景用到了层级关系复杂的数据结构,MongoDB 的嵌套文档和数组特性简化了数据存储和查询 。例如,在任务调度系统中,对于调度任务的回避规则,就用到了Json嵌套的功能:
    在这里插入图片描述

  • 灵活的数据存储
    针对社区数据有很多二进制、视频、图片等非结构化数据,MongoDB提供了这些数据和结构化的数据统一存储的功能,极大地简化了业务逻辑。

  • 高可用和可扩展
    MongoDB 支持复制集(Replica Set),这是一种主从架构的高可用性方案。 复制集可以在多个节点之间自动进行数据同步,并在主节点发生故障时自动选举新的主节点,确保系统的高可用性。同时也有shard的分布式方案,能实现数据的水平扩展。

  • 特殊场景的支持
    由于早期没有组件能直接支持布隆过滤器功能,团队利用MongoDB本身灵活的文档模型和集合操作,以较低的代码量完成了布隆过滤器的功能, 总体思路如下:
    db.bloomFilter.insertOne({bitArray: Array(1000).fill(0)})
    然后程序维护一个函数,将元素转化成1000以内的数字,然后将集合中对应的位置置为1。在最右App中的点赞功能中,确定用户是否已经点赞过,就用的这个功能。

3.挑战与应对

DBA 及业务目前遇到的挑战主要包括:

  • 自由度带来的性能上的不确定性
    因为不同于MySQL的强类型约束,MongoDB灵活的字段模型对开发者有一定的要求,如果不限制在一个集合中大量累积字段,会导致一些存储上的成本和查询上性能的低下。
  • 业务不断扩大带来的数据量和维护上的复杂度
    随着业务的不断扩大,数据量不断增加,由此带来了一些存储上和查询上的成本增加和耗时开销。
  • 老版本的升级问题
    公司最早的一批MongoDB都是自建的3.2版本,随着MongoDB的不断迭代、性能上和新特性的引入,导致需要升级MongoDB版本,以提供更稳定的性能。

应对之道:

  • 针对自由度问题
    在业务需要明确业务字段类型的场景下,团队通过官方schema validation功能对某些字段可以做限制,该功能可以对集合设定非常详细的验证规则,包括字段类型、字段是否必需、字段的最小/最大长度、正则表达式匹配等。
    对于其他业务,则通过一系列的sop,针对字段数量、字段类型、索引数量等给出一些合理的建议,同时功能的增加和代码的上线会做针对性的审核和优化,在自由度和性能上做合理的平衡。

  • 针对复杂度问题: 团队针对业务特点和MongoDB自身的一些特性做了如下的改动

  1. 固定集合功能:固定集合在创建时指定大小,一旦存储空间达到上限,旧数据会被自动覆盖。这样,集合的大小保持恒定,不会无限增长,适合短期缓存的场景。

  2. TTL索引功能:由于很大一部分数据只需要存储固定的时间,这时候团队会创建TTL索引,TTL索引会自动删除过期的数据,

  3. shard的水平扩展:在早期shard没出现的时候,通过手动对业务字段取模,然后存到不同的MongoDB副本集中,实现了“伪shard”的功能。后续官方出了真正的shard之后,就不需要额外通过代码逻辑,直接实现了数据的水平扩展,防止单个副本集的存储无限扩展带来的备份、恢复的复杂度。上云后,阿里云数据库MongoDB版的云原生架构 可以支持灵活增删分片,并通过提供SRV 连接地址,解决了增删mongos 带来的连接地址变更的问题,从而进一步提升了集群的水平扩展能力,降低了运维负担。

  • 针对版本升级的问题:
    MongoDB本身的迭代较快,新版本带来的性能优势提升明显,但是早期架构中使用的固定IP方式,使得升级过程比较复杂、甚至有些特殊场景的业务还要停机升级,这促使团队考虑用了云上的解决方案,将大部分业务迁移至阿里云相较于开源社区,阿里云提供了更长的版本生命周期,为客户版本升级预留了更多的时间;同时阿里云提供了MongoDB版本原地升级的功能,对业务非常友好。

总体收益

小川科技数据库负责人陈伟强表示:
基于MongoDB灵活模式的特性,小川实现了功能的快速迭代和上线,而数据库侧无需任何更改。评论服务最初只需要存储用户ID、评论内容、时间等基本信息,后来因业务需要,增加了基于评论分析的一些用户画像相关的字段。如果用传统的关系性数据库,单修改表结构的时间就需要3-5天,但是用MongoDB就不需要去修改,直接在文档中添加即可,在这个功能的开发中,总体时间比预估的少了20%。

  • MongoDB本身的高可用和分片集群,为业务带来了数据安全性和扩展性的提升。
  • 阿里云及MongoDB原厂的支持,可以让团队面对一些复杂场景或故障的时候,直接和专家团队进行交流,极大的提升了业务的稳定性。
  • 阿里云数据库MongoDB也提供了丰富的运维工具,使得监控、备份、数据同步非常的方便,这些工具的存在让云MongoDB本身的维护和故障的定位变得非常容易。

展望未来:

目前在最右App中,小川正在进行业务创新尝试,用户知识库就用到了Milvus向量数据库。现在的做法是将数据同步到Milvus中,然后实现向量功能,但额外产生了数据实时同步以及额外的存储维护成本。由于未来MongoDB 社区版本将集成向量检索能力,小川团队希望未来能将向量数据功能放在MongoDB中来实现, 希望通过基于统一的平台在AI方向做更多的尝试。


http://www.ppmy.cn/devtools/119583.html

相关文章

互斥量mutex、锁、条件变量和信号量相关原语(函数)----很全

线程相关知识可以看这里: 线程控制原语(函数)的介绍-CSDN博客 进程组、会话、守护进程和线程的概念-CSDN博客 1.同步概念 所谓同步,即同时起步,协调一致。不同的对象,对“同步”的理解方式略有不同。如,设备同步,是…

(23)mysql中mysqldump备份数据库

mysql中mysqldump备份数据库: 1.mysqldump -uroot -p123456 --databases test > test.sql ## 将输出写入test.sql文件 " -u  用户名 -p  密码 -h  hostname 信息 -d(--no-data)  只导出表结构 -A(--all-databases&#xf…

栈(模板)、队列(模板)(9.27)

栈 #include <iostream> #include<vector> using namespace std; template<typename T> class my_stack { private:vector<T> *data;public:my_stack() :data(new vector<T>()){}~my_stack(){delete data;};bool empty();//入栈void push(int …

Python设计模式速通

目录 先导 对象的事情 类的事情 方法 面对对象程序设计的几个基本要点 封装 多态 继承 抽象 组合 面对对象程序设计的准则 开放/封闭原则 控制反转原则 接口隔离原则 单一职责原则 替换原则规定 三大模式 创建型模式 结构型模式 行为型模式 先导 我们开始设…

CSDN 的 GIt 是没东西吗

虽然说吧 CSDN 的博客也就那样&#xff0c;记得去年的时候 CSDN 出了一个 Git 代码库&#xff0c;被骂得要死&#xff0c;基本上是从外面搬了一堆代码回来。 这回 CSDN 又玩了个新东西&#xff0c;干脆你可以把你的博客文章同步到你在 CSDN 开的代码库上了。 如何同步 在 CS…

宠物智能听诊器科技赋能宠物医疗

数据分析与机器学习 智能听诊器利用深度学习算法&#xff0c;识别宠物心脏和呼吸模式&#xff0c;提供健康分析和诊断建议&#xff0c;增强宠物主人和兽医的决策能力。 物联网集成 随着物联网技术的发展&#xff0c;智能听诊器可以集成到智能家居系统中&#xff0c;实现宠物健…

Kubernetes Ingress:简化外部访问的利器

在 Kubernetes 集群中,Ingress 是一个强大的资源对象,它可以为集群内的服务提供外部访问能力。本文将深入探讨 Kubernetes Ingress 的概念、工作原理、配置方法以及最佳实践。 什么是 Ingress? Ingress 是 Kubernetes 中的一个 API 对象,它管理集群外部访问集群内服务的规…

java将word转pdf

总结 建议使用aspose-words转pdf,poi的容易出问题还丑… poi的(多行的下边框就不对了) aspose-words的(基本和word一样) poi工具转换 <!-- 处理PDF --><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres…