瑞幸黑金鹿王者霸屏尊享权益的技术实现方式探讨

上周六,公司加班举办技术专场招聘活动,在忙碌的下午茶歇时间,我尊敬的伟大的韩百万老师提议带着我去瑞幸装了个 BI,扫码领取咖啡的那一个瞬间,瑞幸店内的电视大屏上赫然显示了:韩百万。回来的路上我虚心请教韩老师,才得知这是瑞幸为其黑金鹿会员提供的专属特权权益:王者霸屏!

原本以为这只是一次单纯的装个 BI 行动,谁曾想我“卷”到天际的充满挑战精神的韩百万老师周一又给他的大虾兄弟出了一道题:你想想怎么实现这个功能?。

然后就是“卷”到我了。从技术角度看,这是一个既经典又有趣的场景,涉及到微服务架构、服务间的通信、分布式事务处理以及其他一些非功能性需求的满足。于是乎,我接下了这个“卷”,从单纯的技术角度探讨下这一个场景的具体实现方式。

文章声明:本文所探讨的实现方式仅作为技术交流和娱乐探讨,与瑞幸咖啡实际采用的方案无关,请勿将本文内容与瑞幸咖啡的具体实现方式强行对号入座!

一、全局架构设计

我们先从全局的视角来看整体的架构设计思路:

上图简单示意了一个支撑王者霸屏的微服务架构,从层次上看:

首先,端侧层面包括提供给用户下单的 APP、线下店里的扫码器以及线下店里的大屏等设备,这些设备直接与用户进行交互,构成整个系统的前端。

其次,有明确的网关层,作为微服务架构的入口,承载流量流量网关和业务网关的双重职责作用,不仅可以对请求进行负载均衡,还可以对服务进行鉴权处理,特别是在高流量负载的场景下可以在网关层实现对请求进行限流/降级处理,保证系统的稳定性和可用性。

在和端侧交互的层面,我引入了一个消息队列,虽然在常规系统架构设计中,消息队列的位置不太会出现在这里,上图这个位置主要是为了说明实现和大屏的交互,你猜对了,在王者霸屏这个场景下,我选择了消息队列作为系统和大屏的通信交互方式。

在服务器端,我采用微服务的设计模式,针对王者霸屏这个场景,我设计了多个微服务,包括提供用户信息相关查询的用户微服务,处理咖啡下单商品微服务、订单微服务、库存微服务,以及对接消息队列的微服务(是否需要把消息队列相关的独立成微服务取决于实际场景需求,比如在上图中存在一个与端侧交互行为控制的微服务,那消息队列相关的就不必独立出来)。

最后,底层就是各个微服务对应的数据存储部分,为了简化表达,我未详细展示每个微服务的具体数据存储设计,在实际场景中,每个微服务都有其对应的数据存储方案,以满足各自业务功能的需求。

二、王者霸屏设计

基于上述微服务架构模式,再来看看王者霸屏功能的实现流程:

在这个过程中,用户的扫码行为虽然是一次性操作,但实际系统中可以被解耦为两个处理流程:

  1. 扫码后先对订单进行完结处理,处理完成后返回用户侧。
  2. 同时另外一个处理流程是判断用户是否符合王者霸屏的资格,如果符合,发送消息给消息队列,由大屏服务订阅对应的消息并进行内容展示。

三、关键技术考虑

从我之前对分布式系统架构相关内容的介绍,在王者霸屏这个场景下除了上面的架构设计和流程设计,作为架构师或者主要研发担当来说,还应该考虑以下关键技术点:

1、数据库和缓存

在瑞幸这个场景下,比如对用户订单的数据存储是要考虑分库分表策略的,选型上可以是常规关系型数据库或者新型关系型数据库。

同时为了提高系统的性能并降低数据库的负载,可以使用 Redis 等缓存数据库来对用户信息、王者霸屏资格等这些变动不会那么频繁的数据进行缓存,比如用户信息和王者霸屏的资格状态。

该流程中涉及到不同数据库不同数据表的操作,因此,充分考虑分布式事务的处理机制。

2、系统的扩展性和可维护性

在进行微服务设计时,要充分考虑到各个微服务系统的扩展性,让各个微服务之间尽量独立和解耦。

可使用容器化技术和集群管理,来提高系统的扩展性和可维护性,如 Docker 或者 Kubernetes。

3、安全性

端侧和服务端进行交互需要使用 HTTPS。同时对用户数据要进行适当的加密和脱敏处理。

4、监控与日志

适用 Prometheus、Grafana 等工具进行系统的监控和日志收集,确保系统出现异常时可以及时发现和处理。

四、替代方案思考

1、实时数据库同步方案

将王者霸屏的信息实时写入一个共享的数据库,大屏显示器服务直接从数据库读取最新的数据进行展示。这种方案实现相对简单,数据一致性较好。但是对数据库读写性能要求很高,特别是在高并发的场景下。

2、RESTful/WebHooks

王者霸屏资格确认后,可以通过调用大屏显示服务提供的 RESTful 或者直接触发对应的 WebHooks 来推送消息。这样做相对灵活,可以实现跨平台、跨服务的通信,但是需要保证 API 的稳定性和安全性,可能存在网络延迟的问题。

3、Redis 的发布-订阅功能

使用 Redis 的发布-订阅功能,王者霸屏资格确认后发布消息,由大屏显示服务订阅并展示,这种方案实时性高,性能很好,但是数据持久化相关的操作需要额外处理。在瑞幸这个场景下,可以考虑适用该方式来替换消息队列的实现方式。

4、SSE 方案(Server-Sent Events)

王者霸屏资格确认后可以通过 SSE 向大屏显示服务推送信息,这种方案实时性比较好,也相对轻量级,但是需要保持长连接,对服务器资源有一定的消耗。

5、WebSocket 通信方式

建立王者霸屏资格确定服务和大屏显示服务之间的 WebSocket 连接,实现实时数据推送,实时性比较高,适用于需要频繁交互的场景,但是在王者霸屏场景下适用性比较低,而且这种方案下需要管理 WebSocket 连接的生命周期,对网络和服务性能有一定要求。

当然,除了我介绍的这些方式,一定也还有其他实现方式来实现王者霸屏,具体选择哪种方案需要根据实际业务场景、技术栈以及系统性能要求来进行综合考虑做出最终的方案选型。屏幕前面的你,还有其他方案吗?可以留言一起聊聊~

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

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

相关文章

基于Go框架,Cloudreve个人免费开源网盘系统源码,支持云存储(七牛、阿里云OSS、腾讯云COS、又拍云、OneDrive)

源码介绍 在数字化时代,我们经常需要存储、分享大量的文件,如照片、视频、文档等。然而,许多商业网盘服务却存在限速、收费等问题,给用户带来诸多不便。现在,我们为您推荐一款免费开源的网盘系统——Cloudreve。 Clo…

多维时序 | Matlab实现GRO-CNN-BiLSTM-Attention淘金算法优化卷积神经网络-双向长短期记忆网络结合注意力机制多变量时间序列预测

多维时序 | Matlab实现GRO-CNN-BiLSTM-Attention淘金算法优化卷积神经网络-双向长短期记忆网络结合注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现GRO-CNN-BiLSTM-Attention淘金算法优化卷积神经网络-双向长短期记忆网络结合注意力机制多变量时间序列预测效果一览基…

《GreenPlum系列》GreenPlum初级教程-02GreenPlum单节点安装

文章目录 第二章 GreenPlum安装1.Docker创建centos容器1.1 拉取centos7镜像1.2 创建容器1.3 进入容器1.4 容器和服务器免密操作1.4.1 生成密钥1.4.2 拷贝密钥 1.5 安装ssh服务和网络必须应用1.6 容器设置root密码1.6.1 安装passwd应用1.6.2 容器本机root设置密码 1.7 容器本机免…

用模方软件进行模型的透明贴图,为什么翻出来透明部分是黑的?

答:透贴需要用PNG格式。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能,支持一键自动提取房屋结构,平均1栋复杂建筑物只需3…

Next.js 集成 Auth0 登入和自定义登入页面

Next.js 集成 Auth0 和自定义登入页面 注册账号和基本配置进入 auth0 官网注册账号并登入进入控制台后访问 Applications/Applications进入程序配置页面添加配置 在 Next.js 使用在项目中集成 通过 Auth0Lock 配置方式自定义登入页面效果展示实现过程 注册账号和基本配置 进入…

NeRF 其二:Mip-NeRF

NeRF 其二:Mip-NeRF 1. 混叠图像中的混叠现象 2. 如何抗混叠3. NeRF 中的解决方案4. 圆锥台近似计算与集成位置编码4.1 圆锥台采样4.2 三维高斯逼近圆锥台4.3 集成位置编码 5. Mip-NeRF 与 NeRF 的比较5.1 位置编码与集成位置编码5.2 采样差异5.3 网络数量 Referenc…

力扣2182.构造限制重复的字符串

思路:先记录每个字符的出现次数,构建一个新字符串,从尾取字符,每取一个该字符个数-1,若该字符已经取到有repeatLimit个,则递归取次大的字符,并对应字符个数-1,若没有次大字符了&…

漏洞复现-nginxWebUI runCmd前台远程命令执行漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

TDA4VM,SBL启动

文章目录 参考make BOARD=j721e_evm CORE=mcu1_0 BUILD_PROFILE=release pdk_libs -sj参考:https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1201734/tda4vm-error-while-loading-shared-libraries-libtinfo-so-5-for-building-sdl-in-sdk-0805

【Flutter 开发实战】Dart 基础篇:List 详解

嗨,各位朋友们,欢迎来到这篇博客!今天我们将一起踏入 Dart 语言的神奇世界,深入了解 Dart 中的 List 类型。不用担心,我会尽可能用最通俗易懂的语言,让你对 List 有一个更深刻的理解。 Dart 中的 List Li…

机器学习算法理论:线性回归

线性回归 回归的理论解释:回归分析是确定两种或两种以上变数间相互依赖的定量关系的一种统计分析方法。按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。 如果在回归分析中,只包括一个自变量和一个因变量,…

跟着cherno手搓游戏引擎【5】layer(层)、Glad

编写基类层: Layer.h:提供Attach链接、Detach解绑、Update刷新、Event事件、GetName方法 #pragma once #include"YOTO/Core.h" #include"YOTO/Event/Event.h" namespace YOTO {class YOTO_API Layer{public:Layer(const std::string& nam…

【软件测试】学习笔记-不同视角的软件性能与性能指标

本篇文章探讨新的测试主题:性能测试,因为性能测试的专业性很强,所以我会以从0到1的入门者视角,系统性地阐述性能测试的方法以及应用领域,用实例去诠释各种性能指标。 本篇文章站在全局的视角,帮你梳理软件性…

【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】

前言 大家好吖,欢迎来到 YY 滴C考前速过系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《…

统计学-R语言-4.2

文章目录 前言单变量数据的描述分析分类型数据频数表条形图饼图 数值型数据数值型数据数据的集中趋势--均值数据的集中趋势--众数 离散程度离散程度--极差离散程度--四分位数极差离散程度--方差离散程度--加权方差离散程度--标准差离散程度--变异系数 数据的形状数据的形状--偏…

RAG(检索增强生成 )

📑前言 本文主要是【RAG】——RAG(检索增强生成 )的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句…

最新消息:OpenAI GPT Store 正式上线,GPTs 应用商店来了

OpenAI推出的两款新产品和服务:GPT Store和ChatGPT Team,提供了许多全新的解决方案和功能,旨在帮助用户更轻松地使用和构建GPT工具,同时也增加了公司的收入来源。GPT Store是一个全新的在线平台,允许用户创建和分享自定…

小程序基础学习(多插槽)

先创建插槽 定义多插槽的每一个插槽的属性 在js文件中启用多插槽 在页面使用多插槽 组件代码 <!--components/my-slots/my-slots.wxml--><view class"container"><view class"left"> <slot name"left" ></slot>&…

【DC快速上手教程--1 Setup the DC】

DC快速上手教程--1 Setup the DC 0 Intro1 DC Demo 本篇系列教程介绍总结DC Flow&#xff0c;为了不涉密&#xff0c;在这里以DC labs为Demo做一个入门的介绍&#xff1b;目标&#xff1a;用起来EDA 工具是最基础也是最简单的&#xff1b;重点是如何去分析报告&#xff0c;依据…

Jenkins集成Sonar Qube

下载插件 重启Jenkins 容器 sonarqube 使用令牌 Jenkins 配置 重新构建