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

在这里插入图片描述
随着信息技术的飞速发展,企业在处理海量数据时所面临的挑战日益严峻。特别是在年轻娱乐领域,用户行为的多样性和数据量的激增对数据存储与分析技术提出了更高的要求。在此背景下,小川凭借其前瞻性的技术视野,选择了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方向做更多的尝试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/886286.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AlmaLinux 9 安装mysql8.0.38

文件下载 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.39-linux-glibc2.12-x86_64.tar 选择合适系统版本 下载后解压 tar -xvf mysql-8.0.39-linux-glibc2.12-x86_64.tar解压后里面有三个文件夹 使用mysql-8.0.39-linux-glibc2.12-x86_64.tar.xz即可&#xff0c…

Redis中String类型的常用命令(append,getrenge,setrange等命令)

Redis----String命令 前言.常见的String存储类型. 常见命令1. set 命令2. get 命令3. mget命令与mset命令4. setnx命令5. setex与psetex命令6. incr与incrby与incrbyfloat命令7. decr与decrby命令8. append命令9. getrange和setrange命令10. strlen命令. 前言. 常见的String存…

【Kubernetes】常见面试题汇总(四十五)

目录 102.使用 Kubernetes 时可以采取的最佳安全措施是什么? 103.什么是联合集群? 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 题目…

高中教辅汇总【35GB】

文章目录 一、资源概览二、资源亮点三、获取方式 一、资源概览 这份教辅资源汇总,精心搜集了高中各学科的海量教辅资料,总容量高达35GB,覆盖了语文、数学、英语、物理、化学、生物、历史、地理、政治等所有必修及选修科目。从基础知识点到难…

插槽slot在vue中的使用

介绍 在 Vue.js 中,插槽(slot)是一种用于实现组件内容分发的功能。通过插槽,可以让父组件在使用子组件时自定义子组件内部的内容。插槽提供了一种灵活的方式来组合和复用组件。 项目中有很多地方需要调用一个组件,比…

【H2O2|全栈】关于CSS(9)CSS3扩充了哪些新鲜的东西?(二)

目录 CSS3入门 前言 准备工作 伪元素补充 :before :after 文本溢出属性 转换效果 预告和回顾 后话 CSS3入门 前言 本系列博客主要介绍CSS相关的知识点。 这一期主要介绍以下几个CSS3的知识点: 伪元素补充文本溢出属性转换 没有基础的朋友&#xff…

【Docker】配置文件

问题 学习Docker期间会涉及到docker的很多配置文件,可能会涉及到的会有: /usr/lib/systemd/system/docker.service 【docker用于被systemd管理的配置文件】 /etc/systemd/system/docker.service.d【覆盖配置文件的存放处】 /etc/systemd/system/mul…

网页前端开发之Javascript入门篇(4/9):循环控制

Javascript循环控制 什么是循环控制? 答:其概念跟 Python教程 介绍的一样,只是语法上有所变化。 参考流程图如下: 其对应语法: var i 0; // 设置起始值 var minutes 15; // 设置结束值(15分钟…

VMware Aria Operations for Networks 6.13 发布,新增功能概览

VMware Aria Operations for Networks 6.13 - 网络和应用监控工具 请访问原文链接:https://sysin.org/blog/vmware-aria-operations-for-networks/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org VMware Aria Oper…

Golang | Leetcode Golang题解之第440题字典序的第K小数字

题目&#xff1a; 题解&#xff1a; func getSteps(cur, n int) (steps int) {first, last : cur, curfor first < n {steps min(last, n) - first 1first * 10last last*10 9}return }func findKthNumber(n, k int) int {cur : 1k--for k > 0 {steps : getSteps(cu…

Llama 系列简介与 Llama3 预训练模型推理

1. Llama 系列简介 1.1 Llama1 由 Meta AI 发布&#xff0c;包含 7B、13B、33B 和 65B 四种参数规模的开源基座语言模型 数据集&#xff1a;模型训练数据集使用的都是开源的数据集&#xff0c;总共 1.4T token 模型结构&#xff1a;原始的 Transformer 由编码器&#xff08…

C++入门基础 (超详解)

文章目录 前言1. C关键字2. C的第一个程序3. 命名空间3.1 namespace的定义3.2 命名空间的嵌套3.3 命名空间使用3.4 查找优先级总结 4. C输入和输出4.1 标准输入输出 (iostream库)4.2 文件输入输出 (fstream库)4.3 字符串流 (sstream库)4.4 C格式化输出4.5 std::endl和\n的区别 …

56 门控循环单元(GRU)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录门控循环单元&#xff08;GRU&#xff09;门控隐状态重置门和更新门候选隐状态隐状态 从零开始实现初始化模型参数定义模型训练与预测 简洁实现小结练习 门控循环单元&#xff08;GRU&#xff09; 之前我们讨论了如何在循环神经网络中计算梯…

生信初学者教程(二十三):REF+SVM筛选候选标记物

文章目录 介绍加载R包导入数据准备数据机器学习特征筛选数据分割基础模型Recursive Feature Elimination特征筛选调参最终分类模型测试集验证标记基因输出结果总结介绍 采用了REF(Recursive Feature Elimination) 结合 SVM(Support Vector Machine) 的方法,对差异基因(参…

探索未来:hbmqtt,Python中的AI驱动MQTT

文章目录 **探索未来&#xff1a;hbmqtt&#xff0c;Python中的AI驱动MQTT**1. 背景介绍2. hbmqtt是什么&#xff1f;3. 安装hbmqtt4. 简单的库函数使用方法4.1 连接到MQTT服务器4.2 发布消息4.3 订阅主题4.4 接收消息4.5 断开连接 5. 应用场景示例5.1 智能家居控制5.2 环境监测…

react-问卷星项目(4)

项目实战 使用CSS 尽量不要使用内联CSS 内联style代码多&#xff0c;性能差&#xff0c;扩展性差外链css文件可复用代码&#xff0c;可单独缓存文件 元素内联style 和HTMl元素的style相似必须用JS写法&#xff0c;不能是字符串&#xff0c;里面必须是对象 <span style…

实现epoll事件的两种模型(ET/LT)、epoll反应堆模型

前置知识&#xff1a; 多进程/线程并发服务器、多路I/O转接服务器的简单实现-CSDN博客 1. 事件模型 EPOLL事件有两种模型&#xff1a; Edge Triggered (ET) 边缘触发只有数据到来才触发&#xff0c;不管缓存区中是否还有数据。Level Triggered (LT) 水平触发只要有数据都会…

C++基类构造器的自动调用

C基类构造器的自动调用 虽然基类的构造器和解构器不会被派生类继承&#xff0c;但它们会被派生类的构造器和解构器自动调用&#xff0c;今天我们用代码实证一下。 验证代码 源代码&#xff0c;仔细看注释内容&#xff1a; D:\YcjWork\CppTour>vim c2004.cpp #include &l…

Ubuntu下安装Zookeeper集群

Zookeeper集群是一个开源的分布式协调服务系统&#xff0c;它由Apache软件基金会维护&#xff0c;旨在为分布式应用提供一致性和可靠性的服务。 在Zookeeper集群中&#xff0c;服务器可以扮演三种角色——领导者&#xff08;Leader&#xff09;、跟随者&#xff08;Follower&a…

如何使用ssm实现基于HTML的中国传统面食介绍网站的搭建+vue

TOC ssm758基于HTML的中国传统面食介绍网站的搭建vue 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔…