百万流量的短信网关系统

  • 1、业务背景
  • 2、短信服务商基本信息
  • 3、短信路由网关
  • 4、基于不可变模式改造代码

说明:儒猿技术窝Java并发编程学习笔记

1、业务背景

定时对短信服务商进行PK,如果发现某个服务商不行了,则会在短信网关后台管理服务中更新短信服务商列表,也就是把某些在PK中输掉的服务商替换

2、短信服务商基本信息

短信服务商信息包括服务商请求的url和每次发送的字节数量maxSizeBytes

3、短信路由网关

因为设置url和maxSizeBytes不是一个原子操作,可能出现一个线程刚设置好url,另一个线程过来读取服务商排名为3的服务商场景,那么这个结果就是一个中间状态,其中url和maxSizeBytes并不属于同一个服务商,很可能导致程序出问题

 //更新短信服务商列表public void changeRouterInfo() {Map<Integer, SmsInfo> smsInfoMap = instance.smsInfoMap;SmsInfo smsInfo = smsInfoMap.get(3);smsInfo.setUrl("极光短信");smsInfo.setMaxSizeInBytes(183L);}

4、基于不可变模式改造代码

1.将SmsInfo改造为不可变对象
public final class SmsInfo {//短信服务商编号private final Long id;//短信服务商请求urlprivate final String url;//短信内容最多多少个字节private final Long maxSizeInBytes;public SmsInfo(Long id, String url, Long maxSizeInBytes) {this.id = id;this.url = url;this.maxSizeInBytes = maxSizeInBytes;}//初始化public SmsInfo(SmsInfo smsInfo) {this.id = smsInfo.getId();this.url = smsInfo.getUrl();this.maxSizeInBytes = smsInfo.getMaxSizeInBytes();}
}
2.获取服务商列表的代码改造为防御性复制//获取短信服务商public Map<Integer, SmsInfo> getSmsInfoRouterMap() {//防止对短信路由信息更改,进行防御性的复制return Collections.unmodifiableMap(deepCopy(smsInfoRouterMap));}private Map<Integer, SmsInfo> deepCopy(Map<Integer, SmsInfo> smsInfoRouterMap) {Map<Integer, SmsInfo> result = new HashMap<>(smsInfoRouterMap.size());Iterator<Map.Entry<Integer, SmsInfo>> iterator = smsInfoRouterMap.entrySet().iterator();while (iterator.hasNext()) {Map.Entry<Integer, SmsInfo> mapEntry = iterator.next();result.put(mapEntry.getKey(), new SmsInfo(mapEntry.getValue()));}return result;}
3.提供一个直接替换SmsRouter实例的方法,便于用来刷新整个服务商信息//短信网关对象,通过volatile修饰来保证其他线程的可见性private static volatile SmsRouter instance = new SmsRouter();//获取短信网关对象public static SmsRouter getInstance() {return instance;}//短信服务商列表变更,更新短信网关对象public static void setInstance(SmsRouter smsRouter) {instance = smsRouter;}
4.当短信服务商列表发生变化的时候,我们通过调用changeRouteInfo方法,更新数据库中的服务商信息,接着替换整个SmsRouter实例
这样一来,SmsRouter在构造函数的时候会调用loadSmsInfoRouteMapFromDb方法将更新后的短信服务商列表从数据库中读取出来,
然后更新到内存中//短信服务商列表发生变更public void changeRouterInfo() {//1.更新数据库中短信服务商信息updateSmsRouteInfoLists();//2.更新内存的短信服务商列表SmsRouter.setInstance(new SmsRouter());}

Java并发编程-4-百万流量的短信网关系统相关推荐

  1. java并发编程第一课 线程的创建、停止和状态变更

    开篇词: 由点及面,搭建你的 Java 并发知识网 你好,欢迎学习<Java 并发编程核心 78 讲>,我是讲师星星,一线互联网公司资深研发工程师,参与过集团内多个重点项目的设计与开发. ...

  2. Java 并发编程-不懂原理多吃亏(送书福利)

    作者 | 加多 关注阿里巴巴云原生公众号,后台回复关键字"并发",即可参与送书抽奖! ** 导读:并发编程与 Java 中其他知识点相比较而言学习门槛较高,从而导致很多人望而却步. ...

  3. java并发编程实践_Java并发编程实践如何正确使用Unsafe

    一.前言 Java 并发编程实践中的话: 编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各 ...

  4. java并发编程之美-阅读记录11

    java并发编程实践 11.1ArrayBlockingQueue的使用 有关logback异步日志打印中的ArrayBlockingQueue的使用 1.异步日志打印模型概述 在高并发.高流量并且响 ...

  5. java并发编程之美-阅读记录1

    1.1什么是线程? 在理解线程之前先要明白什么是进程,因为线程是进程中的一个实体.(线程是不会独立存在的) 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程中的 ...

  6. Java并发编程—什么是线程?

    原文作者:way_more 原文地址:Java 多线程常见基础面试题总结,面试必看! 目录 一.什么是线程和进程? 二.简要描述线程与进程的关系 三.FAQ 一.什么是线程和进程? 1.1. 何为进程 ...

  7. Java并发编程面试题(2020最新版)

    转载自  Java并发编程面试题(2020最新版) 基础知识 并发编程的优缺点 为什么要使用并发编程(并发编程的优点) 充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到 ...

  8. java并发编程入门_探讨一下!Java并发编程基础篇一

    Java并发编程想必大家都不陌生,它是实现高并发/高流量的基础,今天我们就来一起学习这方面的内容. 什么是线程?什么是进程?他们之间有什么联系? 简单来说,进程就是程序的一次执行过程,它是系统进行资源 ...

  9. Java并发编程实战_不愧是领军人物!这种等级的“Java并发编程宝典”谁能撰写?...

    前言 大家都知道并发编程技术就是在同一个处理器上同时的去处理多个任务,充分的利用到处理器的每个核心,最大化的发挥处理器的峰值性能,这样就可以避免我们因为性能而产生的一些问题. 大厂的核心负载肯定是非常 ...

  10. java 并发框架源码_某网Java并发编程高阶技术-高性能并发框架源码解析与实战(云盘下载)...

    第1章 课程介绍(Java并发编程进阶课程) 什么是Disruptor?它一个高性能的异步处理框架,号称"单线程每秒可处理600W个订单"的神器,本课程目标:彻底精通一个如此优秀的 ...

最新文章

  1. java连接mysql以及增删改查操作
  2. 汇编和python-python与汇编
  3. 在EXCEL里如何输入X的平方
  4. C#设置WebBrowser使用Edge内核
  5. java各种数据库对应的jar包、驱动类名和URL格式
  6. java遍历实体类的属性名称与值
  7. 编译是检查c语言,为什么CMake检查C编译器?
  8. 2029年计算机考试题目,计算机二级题集
  9. ArcMap操作技巧
  10. 英雄多少钱steam_Steam农历新年特卖:越来越火热的中国单机游戏市场 | 游戏干线...
  11. 网络博客营销之博客设置和优化
  12. VFP 常用 OCX 控件 注册
  13. SpringBoot Web开发
  14. 【​观察】做好数据到介质的连接者 新数据时代浪潮存储的行与思
  15. 鸿蒙EMUI10升级体验,华为P30升级EMUI10,体验如何?我给大家说一说!
  16. springboot控制台日志打印到日志文件 (请求路径,执行sql,参数等)
  17. 人工智能与医疗领域的融合发展
  18. doc88文档下载方法
  19. OpenCV与Open3D等开源视觉库的详细笔记
  20. 机房收费系统——软件需求说明书

热门文章

  1. Audio AudioFocus流程
  2. python爬虫-批量下载qq音乐
  3. 基于Bootstrap垂直响应的jQuery时间轴特效
  4. element-ui下载到本地方法(python 或java)
  5. win7电脑变身WiFi热点,让手机、笔记本共享上网
  6. Xposed小白入门,动态修改IMEI实例代码
  7. 應電鍍廠要求把5個ITEM的主單位PRIMARY UOM由L改為KG
  8. vs picturebox 图片缩放
  9. PDF处理技巧分享之PDF合并:一键实现几个PDF合并成一个PDF
  10. 外星人入侵(python期末课程设计+源代码)