EMQX在自助洗车项目分布式部署中如何保障只有一个客户端消费?

最近打算把自助洗车项目部署到云上,根据流量自行扩展/缩减服务以保障高可用,以及防范DDOS/CC等攻击。可这样就会出现一个问题,多端的情况下,如何保障不重复,只有一个客户端消费了消息,经过查询资料,想出了几种方案。

1. 在业务代码中自行处理

 - 每条消息记录唯一的ID。
 - 然后每次消费前判断是否该ID已经消费。
 - 具体代码就请自行实现。
  • 优点是该方案定制性强
  • 缺点是处理太过麻烦,得记录ID,且判断是否消费前得加锁/释放锁等操作,高并发性能差。

2. EMQX 共享订阅(最优方案)

官网介绍
共享订阅是在多个订阅者之间实现负载均衡的订阅方式,EMQX 在 MQTT v3.1.1 中已经实现共享订阅共享订阅,MQTT v5.0 协议中这一特性成为标准的一部分。

共享订阅能够解决以下问题:

集群模式下,如果订阅者所在的节点发生故障,则发布者的消息会丢失(QoS 0)或者堆积在节点中(QoS 1, 2)。可以通过增加订阅节点的方式解决这一问题,但这样又产生了大量的重复消息浪费了性能,并增加了业务的复杂度。

当发布者的生产能力较强时,可能会出现订阅者的消费能力无法及时跟上的情况,此时只能由订阅者自行实现负载均衡来解决,又一次增加了用户的开发成本。

共享机制

上图中,共享 3 个 subscriber 用共享订阅的方式订阅了同一个主题 $share/g/topic,其中topic 是它们订阅的真实主题名,而 $share/g/ 是共享订阅前缀。EMQX 支持两种格式的共享订阅前缀:

示例前缀真实主题名
$share/abc/t/1$share/abc/t/1
  • 该方案就是多个订阅只会发送给其中一个节点,实现简单,最为推荐。

3. 排他性订阅

示例前缀真实主题名
$exclusive/t/1$exclusive/t/1

排它订阅允许对主题进行互斥订阅,一个主题同一时刻仅被允许存在一个订阅者,在当前订阅者未取消订阅前,其他订阅者都将无法订阅对应主题。

当某个客户端 A 订阅 $exclusive/t/1 后,其他客户端再订阅 $exclusive/t/1 时都会失败,直到 A 取消了对 $exclusive/t/1 的订阅为止。

注意: 排它订阅必须使用 $exclusive/ 前缀,在上面的示例中,其他客户端依然可以通过 t/1 成功进行订阅。

  • 该方案作为知识点即可,因为如果订阅失败的话,一般情况下程序会自动重连,这样会导致云上费用增加,且实现不合理。

有一个点一定要记住,emqx支持同一用户登录多个,但是client id一定要不同,所以同一套代码在需要部署分布式时client-id最好配置为随机uuid。

# auth 157239486@qq.com
# java application.yml配置示例
client-id: ${random.uuid}   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目名称:自助洗车平台 项目背景:随着汽车保有量的不断增长,洗车市场逐渐形成。但传统洗车方式存在排污、耗水、人工成本高等问题自助洗车成为一种新兴的洗车方式。本项目旨在建立一个自助洗车平台,方便消费者进行自主洗车,减少传统洗车方式的不利影响。 项目职责: 1. 架构设计:设计并实现自助洗车平台的架构,包括前端、后端、数据库、缓存、负载均衡、日志等组件的选择和配置。其,Nginx 负责反向代理和负载均衡,Tomcat 负责处理业务逻辑,keepalived 实现高可用性,redis 缓存常用数据,MySQL 存储洗车记录,inotify+rsync 实现文件同步,ELK 实现日志管理和分析。 2. 系统开发:基于 Spring Boot 框架,使用 Java 语言开发自助洗车平台的后端系统,实现洗车订单管理、设备管理、用户管理、支付管理等功能。同时,使用 Vue.js 开发前端页面,实现用户注册、登录、下单、支付等功能。 3. 数据库设计:设计并实现 MySQL 数据库,建立洗车订单表、设备信息表、用户信息表、支付记录表等,实现数据的存储和管理。 4. 缓存设计:使用 Redis 缓存常用数据,如用户信息、设备状态等,提高系统的响应速度和并发能力。 5. 日志管理:使用 ELK(Elasticsearch、Logstash、Kibana)实现日志的收集、分析和管理,方便运维人员进行系统监控和问题排查。 6. 系统部署:使用 Docker 镜像技术,将自助洗车平台的各个组件打包成镜像,并使用 Kubernetes 进行容器编排和部署,实现系统的高可用性和自动化运维。 7. 系统监控:使用 Zabbix 实现系统监控,包括 CPU、内存、磁盘、网络等性能指标的监控和告警,保障系统的稳定性和可靠性。 项目收益: 1. 提高用户体验:通过自助洗车平台,消费者可以方便、快捷地进行洗车,提高用户体验和满意度。 2. 减少人工成本:自助洗车平台减少了人工操作和管理成本,提高了洗车效率和经济效益。 3. 降低环境污染:自助洗车平台的洗车方式较传统方式更为环保,减少了水资源和废水排放,降低了环境污染。 4. 提高系统运维效率:通过自动化运维和日志管理,减少人工操作,提高系统稳定性和运维效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值