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

上周六,公司加班举办技术专场招聘活动,在忙碌的下午茶歇时间,我尊敬的伟大的韩百万老师提议带着我去瑞幸装了个 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.mzph.cn/news/620324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud:微服务

文章目录 微服务服务架构演变单例架构(集中式架构)分布式架构 微服务SpringCloud 微服务 服务架构演变 单例架构(集中式架构) 单例架构: 将业务的所有功能集中在一个项目中开发,打成一个包部署 优点&…

redis(14):缓存雪崩、击穿、穿透及其处理方式

1 Redis 缓存过程 通常后端会采用Mysql等磁盘数据库,可以持久化但是访问慢,高并发时性能差,需要设置Nosql内存型数据库缓存:Redis等; Redis 数据库运行在内存中,因此他的查询速度比 MySql 快的多。所以我们会把一些用户经常查询的数据放在 Redis 中,当 Redis 有的时候…

TCP之三次握手四次挥手与UDP区别

文章目录 1 TCP三次握手四次挥手1.1 数据包说明1.1.1 TCP数据包1.1.2 UDP数据包1.1.3 TCP和UDP差异1.1.4 TCP可靠性传输机制 1.2 三次握手1.2.1 三次握手定义1.2.2 三次握手问题1.2.2.1 问题引入分析1.2.2.2 历史连接1.2.2.3 同步双方初始序列号1.2.2.4 避免资源浪费 1.3 四次挥…

Java项目:07 Springboot的客户管理系统

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 springboot客户管理系统 功能模块:登录修改密码客户列表充值列表消费记录客户类型 环境:IDEAjdk1.8Tomcat9MySQL5.7maven3.6…

POI-tl 知识整理:整理2 -> 标签

1 文本标签 {{var}} 数据模型: String :文本 TextRenderData :有样式的文本 HyperlinkTextRenderData :超链接和锚点文本 Object :调用 toString() 方法转化为文本 代码示例: Testpublic void testText…

Jenkins 问题

从gitlab 仓库拉去代码到Jenkins本地报错 ERROR: Couldn’t find any revision to build. Verify the repository and branch configuration for this job. 问题原因: 创建条目》配置的时候,gitlab仓库不存在master分支 修复后:

【学习】FPGA verilog 编程使用vscode,资源占用多 卡顿 卡死 内存占用多解决方案

问题描述 FPGA verilog 编程使用vscode,资源占用多 卡顿 卡死 内存占用多解决方案。 32G内存,动不动就暂用50%!! 解决方案 1.打开设置 文件->首选项->设置 或者点击软件界面的左下角的齿轮按钮 2.进入如下【设置】界面 …

网络安全B模块(笔记详解)- 网络渗透测试

LAND网络渗透测试 1.进入虚拟机操作系统:BT5中的/root目录,完善该目录下的land.py文件,填写该文件当中空缺的Flag1字符串,将该字符串作为Flag值(形式:Flag1字符串)提交;(land.py脚本功能见该任务第6题) 输入flag sendp(packet) Flag:sendp(packet) 2.进入虚拟机操作…

JavaScript-3

Web API 基本认知 作用和分类 作用:就是使用 JS 去操作 html 和 浏览器分类:DOM ( 文档对象模型 )、BOM ( 浏览器对象模型 ) DOM 是什么 DOM ( Document Object Model —— 文档对象模型 )它是用来呈现以及与任意 HTML 或 XML 文档交互的 API通俗的说…

MongoDB认证考试小题库

Free MongoDB C100DBA Exam Actual Questions 关于MongoDB C100 DBA 考试真题知识点零散整理 分片架构 应用程序 --> mongos --> 多个mongod对于应用来说,连接分片集群跟连接一台单机mongod服务器一样分片好处, 增加可用RAM、增加可用磁盘空间、…

缓存和数据库一致性

前言: 项目的难点是如何保证缓存和数据库的一致性。无论我们是先更新数据库,后更新缓存还是先更新数据库,然后删除缓存,在并发场景之下,仍然会存在数据不一致的情况(也存在删除失败的情况,删除…

如何高效进行项目文档的编制及管理?

“做完一个项目到底会产出多少份文档?” 今天看到这样一个吐槽贴:小李作为刚入行的项目经理,每天上班期间电话、会议、邮件各种不停歇,晚上还要加班做各种文档;由于经验不足,熬到十一二点还做不完是常态。…

Vue学习笔记五--路由

1、什么是路由 2、VueRouter 2、1VueRouter介绍 2、2使用步骤 2、3路由封装 3、router-link 3.1两个类名 3.2声明式导航传参 4、路由重定向、404 当找不到路由时,跳转配置到404页面 5、路由模式 6、通过代码跳转路由---编程式导航&传参 路由跳转时传参 跳转方式…

Java 并发之《深入理解 JVM》关于 volatile 累加示例的思考

在周志明老师的 《深入理解 JVM》一书中关于 volatile 关键字线程安全性有一个示例代码(代码有些许改动,语义一样): public class MyTest3 {private static volatile int race 0;private static void increase() {race;}public …

亚马逊时尚如何运用人工智能帮助您找到合适的尺码

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Docker五部曲之一:容器术语介绍

文章目录 前言背景基本术语容器镜像容器镜像格式容器引擎容器容器主机注册中心容器编排 进阶术语容器运行时镜像层标签存储库名称空间 参考 前言 本文内容翻译自参考文献。 背景 要理解容器术语,重要的是要精确地理解容器是什么。容器实际上是两个不同的东西。像…

Linux驱动学习—I2C总线

1、应用层实现I2C通信 1.1 I2C简介 I2C是很常见的一种总线协议,I2C是NXP公司设计的,I2C使用两条线在主控制器和从机之间进行数据通信。一条是SCL(串行时钟线),另外一条是SDA(串行数据线),因为I2C这两条数…

Windows Server 2019配置多用户远程桌面登录服务器

正文共:1234 字 21 图,预估阅读时间:2 分钟 很久之前,在介绍显卡直通的时候我们简单介绍过RDP(Remote Desktop Protocol,远程桌面协议)(前人栽树:失败的服务器显卡操作&a…

第 3 场 蓝桥杯小白入门赛 解题报告 | 珂学家 | 单调队列优化的DP + 三指针滑窗

前言 整体评价 T5, T6有点意思&#xff0c;这场小白入门场&#xff0c;好像没真正意义上的签到&#xff0c;整体感觉是这样。 A. 召唤神坤 思路: 前后缀拆解 #include <iostream> #include <algorithm> #include <vector> using namespace std;int main()…

Android平台RTMP推送|轻量级RTSP服务|GB28181设备接入模块之实时快照保存JPG还是PNG?

JPG还是PNG&#xff1f; JPG和PNG是两种常见的图片文件格式&#xff0c;在压缩方式、图像质量、透明效果和可编辑性等方面存在显著差异。 压缩方式&#xff1a;JPG是一种有损压缩格式&#xff0c;通过丢弃图像数据来减小文件大小&#xff0c;因此可能会损失一些图像细节和质量…