短信负载均衡

基本流程

String loadBalancersName = loadBalancers.get(loadBalancerType);
SendLoadBalancer sendLoadBalancer = registerBeanHandler.getBean(loadBalancersName, SendLoadBalancer.class);
String channelLabel = sendLoadBalancer.chooseChannel(smsTemplateVOs,mobiles);;

根据短信模板,选择负载均衡器

根据负载均衡器,选择channel配置文件

根据配置的channel 进行短信发送

负载均衡器

有若干种类

负载均衡器需要实现两个接口

1. 选择channel

2. 获得所有channel

public interface SendLoadBalancer {/**** @description 根据模板、电话负载均衡发送* @param SmsTemplates 模板列表* @param mobile 电话号码* @return 通道类型*/String chooseChannel(List<SmsTemplateVO> SmsTemplates, Set<String> mobile);/**** @description 查询拥有当前模板,活跃状态的通道* @param SmsTemplates 模板列表* @return 通道类型*/Map<String, String> getChannelList(List<SmsTemplateVO> SmsTemplates);
}

channel有两点参数

1. channel        阿里云、腾讯

2. level        权重

@Override
public Map<String, String> getChannelList(List<SmsTemplateVO> SmsTemplates) {
//处理模板
Set<String> channelLabelList = SmsTemplates.stream()
.map(SmsTemplateVO::getChannelLabel).collect(Collectors.toSet());
//查询模板对应的渠道
List<SmsChannelVO> smsChannels =smsChannelService.findChannelInChannelLabel(channelLabelList);
if (!EmptyUtil.isNullOrEmpty(smsChannels)){
return smsChannels.stream()
.collect(Collectors.toMap(SmsChannelVO::getChannelLabel, SmsChannelVO::getLevel));
}
return null;
}

Hash负载均衡

@Component
public class HashSend extends BaseSendLoadBalancer {@Overridepublic String chooseChannel(List<SmsTemplateVO> SmsTemplates, Set<String> mobile) {//获得当前模板对应的渠道Map<String, String> channelMap = super.getChannelList(SmsTemplates);//取得channel地址ListSet<String> keySet = channelMap.keySet();ArrayList<String> keyList = new ArrayList<String>();keyList.addAll(keySet);// 使用mobile取余int hashCode = mobile.hashCode();int serverListSize = keyList.size();int serverPos = hashCode % serverListSize;return keyList.get(serverPos);}}

1. 根据手机号生成hashcode

2. 对channel长度取余

3. 获得余数

随机

    @Overridepublic String chooseChannel(List<SmsTemplateVO> SmsTemplates, Set<String> mobile) {//获得当前模板对应的渠道Map<String, String> channelMap = super.getChannelList(SmsTemplates);// 取得channel地址ListSet<String> keySet = channelMap.keySet();ArrayList<String> keyList = new ArrayList<String>();keyList.addAll(keySet);Random random = new Random();int randomPos = random.nextInt(keyList.size());return keyList.get(randomPos);}

生成个随机数,然后取余

轮询

    @Overridepublic String chooseChannel(List<SmsTemplateVO> SmsTemplates, Set<String> mobile) {//获得当前模板对应的渠道Map<String, String> channelMap = super.getChannelList(SmsTemplates);// 取得通道地址ListSet<String> keySet = channelMap.keySet();ArrayList<String> keyList = new ArrayList<String>();keyList.addAll(keySet);String channelName = null;synchronized (pos) {if (pos >= keySet.size())pos = 0;channelName = keyList.get(pos);pos ++;}return channelName;}

对pos上锁,让pos++

如果大于channel大小,让pos重置

根据pos获得channel

加权随机

    @Overridepublic String chooseChannel(List<SmsTemplateVO> SmsTemplates, Set<String> mobile) {//获得当前模板对应的渠道Map<String, String> channelMap = super.getChannelList(SmsTemplates);// 取得channel地址ListSet<String> keySet = channelMap.keySet();Iterator<String> iterator = keySet.iterator();List<String> serverList = new ArrayList<String>();while (iterator.hasNext()) {String channel = iterator.next();int weight = Integer.valueOf(channelMap.get(channel));for (int i = 0; i < weight; i++)serverList.add(channel);}Random random = new Random();int randomPos = random.nextInt(serverList.size());return serverList.get(randomPos);}

channel * 权重,放入serverList

在生成随机数

加权轮询

 @Overridepublic String chooseChannel(List<SmsTemplateVO> SmsTemplates, Set<String> mobile) {//获得当前模板对应的渠道Map<String, String> channelMap = super.getChannelList(SmsTemplates);// 取得channel地址ListSet<String> keySet = channelMap.keySet();Iterator<String> iterator = keySet.iterator();List<String> channelListHandler = new ArrayList<String>();while (iterator.hasNext()) {String server = iterator.next();Integer weight = Integer.valueOf(channelMap.get(server));for (int i = 0; i < weight; i++)channelListHandler.add(server);}String channelName = null;synchronized (pos) {if (pos > keySet.size())pos = 0;channelName = channelListHandler.get(pos);pos++;}return channelName;}

和加权随机一样

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

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

相关文章

MyEclipse 新手使用教程

MyEclipse 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;基于 Eclipse 平台&#xff0c;专为 Java 开发设计&#xff0c;特别适合企业级应用开发。它集成了各种开发工具和插件&#xff0c;支持多种编程语言和框架&#xff0c;包括 Java EE、Spring、Hi…

【Redis延迟队列】redis中的阻塞队列和延迟队列

阻塞队列&#xff08;RBlockingQueue&#xff09; 作用和特点&#xff1a; 实时性&#xff1a;阻塞队列用于实时处理消息。生产者将消息放入队列&#xff0c;消费者可以立即从队列中取出并处理消息。阻塞特性&#xff1a;如果队列为空&#xff0c;消费者在尝试获取消息时会被…

【C语言】文件操作(中卷)

前言 在文件操作&#xff08;上卷&#xff09;中&#xff0c;讲到的主要都是正式文件操作开始之前的前置知识&#xff0c;而这一卷中&#xff0c;我们将开始正式地操作文件。 在上卷中我们已经说到&#xff0c;stdin stdout stderr是三个C语言程序启动时默认打开的流。这三个流…

HarmonyOS应用开发学习历程(1)初识DevEco Studio

1.create project Bundle name&#xff1a;包名&#xff0c;标识应用程序&#xff0c;默认应用ID也使用该名 Compile SDK&#xff1a;编译时API版本 2.工程目录 AppScope&#xff1a;应用全局所需资源 entry&#xff1a;应用的主模块&#xff0c;含代码、资源 hvigor&#…

C语言编程实现年增长率的计算:深入探讨与实际应用

C语言编程实现年增长率的计算&#xff1a;深入探讨与实际应用 在数据分析和商业领域中&#xff0c;年增长率是一个至关重要的指标&#xff0c;它能够帮助我们了解某个指标在一定时间内的变化趋势。在C语言编程中&#xff0c;我们同样可以通过编写相应的程序来计算年增长率。本…

TimeDao-一篇文章了解清楚Subspace项目

1 项目简介 什么是Subspace网络&#xff1f; Subspace是为下一波加密创建者构建的第四代区块链。旨在实现web3规模扩容。 Subspace允许开发者以互联网规模运行 Web3 应用。它提供了一个简单的接口&#xff0c;用于快速部署按需求自动扩展的多链去中心化应用。Subspace由一个…

【C++】6-8 你好,自定义类型的输入输出

6-8 你好&#xff0c;自定义类型的输入输出 分数 15 全屏浏览 切换布局 作者 向训文 单位 惠州学院 完善程序&#xff0c;使程序正确运行&#xff1a; Student类为Person类的派生类 裁判测试程序样例&#xff1a; #include <iostream> #include <string> us…

微积分归纳总结:中值定理(大全包括函数、微分、积分)

微积分归纳总结&#xff1a;中值定理 关于连续函数的中值定理 函数连续则有一下中值定理 名称内容证明有界与最值闭区间的连续函数在该区间上有界并一定有最大值和最小值同济的高数书上证明从略零点定理若函数 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上连续&#…

Python实例:Excel表格内容行列转置

原文链接&#xff1a;http://www.juzicode.com/python-example-excel-col-row-transpose 今天的例子实现对Excel表格的行列值完成转置。 原始表格为:A | B | C 1 | 2 | 3 * | ( | ) 经过转置后变为&#xff1a;A | 1 | *B | 2 | (C | 3 | )方法1&#xff0c;用xlrd读取excel文…

神经网络与深度学习——第7章 网络优化与正则化

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第7章 网络优化与正则化 网络优化与正则化 网络优化 网络结构多样性 高维变量的非凸优化 神经网络优化的改善方法 优化算法 小批量梯度下降 批量大小选择 学习率调整 学习率衰减 学习率预热 周期性学习率调…

HCIP-Datacom-ARST自选题库__EBGP【18道题】

一、单选题 1.在排除EBGP邻居关系故障时&#xff0c;你发现两台直连设备使用Loopback口建立连接&#xff0c;故执行display current-configurationconfiguration bgp查看peer ebgp-max-hop hop-count的配置&#xff0c;下列哪项说法是正确的? hop-count必须大于2 hop-count…

8条黄金准则,解决API安全问题

API&#xff08;应用程序编程接口&#xff09;是现代软件开发中不可或缺的一部分。它们允许不同的应用程序之间共享数据和功能&#xff0c;从而促进了软件系统的整合和互操作性。然而&#xff0c;随着API使用的普及&#xff0c;安全性问题也开始浮出水面。 API安全是指保护API免…

Java反射实战指南:反射机制的终极指南

1. 反射机制简介 在Java中&#xff0c;反射机制提供了一种强大的工具&#xff0c;用于在运行时检查类、接口、字段和方法。但它的重要性不止于此&#xff0c;它允许程序动态加载、探索和使用编译时完全未知的代码。这种能力是Java语言支持的一种“动态”特性&#xff0c;使得J…

Windows 剪映专业版 v5.9.0 解锁VIP、解除限制功能!

介绍 该脚本具备多项高级功能&#xff0c;包括人像抠图、会员专属模板、超清画质以及素材预设。会员可使用的功能均通过此脚本解锁。 解锁剪映软件会员功能&#xff0c;包括人像抠图、会员模板、超清画质以及素材预设等。 在标准操作流程中&#xff0c;用户首先在电脑端启动…

系统架构设计师【第12章】: 信息系统架构设计理论与实践 (核心总结)

文章目录 12.1 信息系统架构基本概念及发展12.1.1 信息系统架构的概述12.1.2 信息系统架构的发展12.1.3 信息系统架构的定义 12.2 信息系统架构12.2.1 架构风格12.2.2 信息系统架构分类12.2.3 信息系统架构的一般原理12.2.4 信息系统常用4种架构模型12.2.5 企业信息系…

[C++] 小游戏 斗破苍穹 2.2.1至2.11.5全部版本(上) zty出品

大家好,今天zty整合了斗破苍穹2.2.1到2.11.5的所有版本 我这么辛苦,就要50个赞吧 2.2.1 #include<stdio.h> #include<ctime> #include<time.h> //suiji #include<windows.h> //SLEEP函数 struct Player //玩家结构体,并初始化player { char name[…

大模型应用:Prompt-Engineering优化原则

1.Prompt-Engineering 随着大模型的出现及应用&#xff0c;出现了一门新兴“技术”&#xff0c;该技术被称为Prompt-Enginerring。Prompt Engineering即提示工程&#xff0c;是指在使用大语言模型时&#xff0c;编写高效、准确的Prompt(提示词)的过程。通过不同的表述、细节和…

CSS动画效果(炫酷登录页面)

1.整体效果 https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa6ibiceejK9loT70yREYASOhuSRaI6vQtQ42zN48oafaWDzdndicRuicL31ZuK3mhD82oJThcFHYuSCkw/640?wx_fmtgif&fromappmsg&wxfrom13 一个酷炫的登录页不仅能够吸引用户的注意力&#xff0c;还能够提升品牌形象&#…

【JavaEE 进阶(二)】Spring MVC(下)

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多进阶知识 目录 1.前言2.响应2.1返回静态界面2.2返回数据2.3返回HTML代码 3.综合练习3.1计算器3.2用户登…

ROS简介

ROS概念 学习路线 操作系统 Linux环境下编译执行c文件&#xff08;需安装vim超文本编辑器&#xff09; sudo g MyCoding.cpp -o CodeTest //生成一个名字为CodeTest的可执行文件 sudo ./CodeTest //执行c文件版本问题 ROS Melodic Morenia 和 ROS Noetic Ninjemys 是…