分布式场景下的稳定性保障

1、什么是稳定性保障

稳定性保障简单理解就是不让系统出现不可用的情况,或者不可用的情况每年只能发生几十分钟。为什么要稳定性保障?因为现在很多的电商和支付系统已经属于社会基础系统,持续一段时间不可用会影响比较大,同时也损失了用户的信任。

稳定性保障的场景非常多,只要流量非常大的业务就需要系统性的进行稳定性保障,包括直播、电商秒杀、电商大促等场景。2022年9月3日晚刘德华“把我唱给你听”线上演唱会,最终这场线上演唱会的在线观看人次达到3.5亿,那么支持3.5亿人次观看就是一种稳定性保障场景。每年电商网站618、99、双11和双12大促。除了大促以外,还有很多亿级用户的产品也需要稳定性保障,如电商交易、第三方支付、演唱会直播等场景。还有很多秒杀的场景,如每晚8点某电商网商1499秒杀茅台、在12306网站提前N天抢票。

阅读全文

分布式场景下的资损防控

资损的定义

资损是在指在业务活动中,业务规则和实际资金流动不一致,导致业务参与方中的任何一方或多方遭受了资金损失。简单理解就是系统的某个功能出现了BUG,导致用户或者公司出现了资金的损失,比如在营销过程中多给某个用户发了10元红包,或者是用户领取了10元红包无法使用,用户在支付时看到的订单金额是100元,结果支付了101元或99元,这些情况都属于资损,用户支付了101用户资损1元,用户实际支付了99元公司资损了1元。

为什么要重视资损防控?因为资金损失如果金额巨大会直接毁掉一个业务,比如在某个业务一次运营活动中把9折的优惠券配成1折,然后发给了几百万个用户,这里面可能涉及到几千万的资金损失,但是这个业务本身就没有盈利几千万,所以只要业务涉及到资金流动一定是非常重要的事情。

阅读全文

使用了lombok后如何生成正确源码包

使用lombok后,如果没有任何配置,则打包的源码与实际class文件是不符合的,此时打开源码IDEA会提示Library source does not match the bytecode for class,而解决该问题也很简单,只需要pom中增加如下配置即可,打包时指定maven参数-Prelease即可生成正确的源码包:

阅读全文

聊聊动态线程池的9个场景

大家好,我是小马哥。

线程池是一种基于 池化思想管理线程 的工具,使用线程池可以减少 创建销毁线程的开销,避免线程过多导致 系统资源耗尽。在 高并发以及大批量 的任务处理场景,线程池的使用是必不可少的。

如果有在项目中实际使用线程池,相信你可能会遇到以下痛点:

  1. 线程池随便定义,线程资源过多,造成服务器高负载。
  2. 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。
  3. 线程池任务执行时间超过平均执行周期,开发人员无法感知。
  4. 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。
  5. 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。
  6. 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。
  7. 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。
  8. 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。
阅读全文

java服务器调试指南

java服务器调试指南

在实际开发中,总会遇到程序启动不起来或者运行结果不符合期望的情况,如果是在本地,直接debug就行了,几乎人人都会,但是如果到了远程,大多数情况下我们可以看日志,通过日志排查定位到问题,但是如果你的日志不多,或者日志中看不出问题,此时情况就比较难以处理了,而实际上我们仍然可以通过debug的形式来解决,只不过由原来的本地在ide中通过GUI来debug变为通过命令行来debug;

阅读全文

如何利用 RPA 实现自动化获客?

一、RPA 是什么?难吗?

RPA 对大家来说,可能挺陌生的,其实它很简单。

Robotic Process Automation(简称 RPA )机器人流程自动化,是一种技术,是以软件机器人 + AI / OCR 等科技能力结合,在软件上的某些业务操作场景中,达到机器替人,实现重复的工作自动化。

RPA 通过模拟人在电脑、平板和手机上的操作方式,包括 Web 自动化、桌面软件自动化、手机 APP 自动化、鼠标键盘自动化等等,实现不需要人工,替人将操作流程自动化。

阅读全文

关于证书,这里有你想知道的一切

关于证书,这里有你想知道的一切

在HTTPS开发中,你是否被各种证书搞得晕头转向?.pem证书?.der证书?X.509证书?本文带你理清这些证书叫法背后的含义;

阅读全文

k8s中部署traefik并开启https支持

k8s中部署traefik并开启https支持

k8s现在已经是容器编排领域的事实标准了,而在我们部署k8s集群时,ingress组件是必不可少的,在k8s领域,做的比较好的ingress组件就是traefik了,原生支持k8s,配置简单,上手极快,下面我们就来讲讲如何部署traefik并开启https支持;

阅读全文

领域事件 disruptor 使用场景之实现Spring事件驱动模型 ApplicationEvent

前言

Disruptor 是一个开源的并发框架。由英国外汇交易公司LMAX开发的一个高性能队列,并且大大的简化了并发程序开发的难度,获得2011Duke’s程序框架创新奖。

阅读全文

MySQL驱动中关于时间的坑

MySQL驱动中关于时间的坑

背景:MySQL 8.0数据库;

最近在做一个小框架,因为本身比较精简,就没有引入太多依赖,直接用了JDBC来操作数据库,因为我的表中有一个datetime类型的字段,对应的Java代码中使用的是java.time.LocalDateTime,在处理这个日期字段的时候,就遇到了一个有趣的问题;

在我的数据库表建好后,在Java中使用JDBC原生API实现了一个repository,包含一些数据库的操作,因为代码中有java.time.LocalDateTime字段,在使用java.sql.PreparedStatement的时候不确认java.sql.PreparedStatement.setObject(int, java.lang.Object)方法接收java.time.LocalDateTime类型的入参后是否可以正确处理,就写了一小段测试用例来测试,核心代码如下:

preparedStatement.setObject(1, LocalDateTime.now());

一行简单的JDBC调用设置参数,参数类型是LocalDateTime,最终发现没有报错,如果一切OK,那么事情到这里就结束了,但是…….

阅读全文

2FA双因子认证之OTP算法

2FA双因子认证之OTP算法

概述

2 Factor Authentication简称2FA,双因子认证是一种安全密码验证方式。区别于传统的密码验证,由于传统的密码验证是由一组静态信息组成,如:字符、图像、手势等,很容易被获取,相对不安全。2FA是基于时间、历史长度、实物(信用卡、SMS手机、令牌、指纹)等自然变量结合一定的加密算法组合出一组动态密码,一般每60秒刷新一次。不容易被获取和破解,相对安全。

TOTP/HOTP作为其中的一种(实际是两种,不过其中一个是变种,这里当作一种)算法,目前已经用于大多数网站,例如GitHub、阿里云等;

阅读全文

HMAC算法

HMAC算法

算法简介

提供一种方法来检查通过不可靠介质传输或存储在不可靠介质中的信息的完整性是开放计算和通信领域的首要必要条件,例如在广域网上传输数据,就可以认为是通过不可靠介质传输数据,因为在广域网上我们的数据要经过N多个不可控节点,任意一个节点都可能修改我们的数据或者丢弃我们数据的一部分,当我们接到消息后需要使用某种方法检查信息的完整性;

基于密钥提供这种完整性检查的机制通常称为 message authentication codes(MAC) ;通常,MAC在共享密钥的两方之间使用,以验证在两方之间传输的数据,本文中,我们提出一种基于加密 hash 的MAC机制,我们称之为HMAC,而这就是本文要介绍的HMAC(Keyed-Hashing for Message Authentication)算法;

PS:单纯的MD5、SHA1、SHA256等摘要算法仅仅能在可靠渠道上用来消息是完整的,例如某个软件官方发布了他们的安装包的SHA256摘要值,这是一个可靠的渠道,然后我们基于这个从可靠渠道获取到的摘要可以来校验我们从不可靠渠道上获取到的该软件的安装包是否是完整的,而如果我们获取摘要的渠道也是不可靠的时候,普通摘要算法就无法使用了,因为摘要本身可能也会被破坏、篡改,而HMAC算法则能应对这种情况;该算法在TLS的握手流程中有使用;

HMAC算法可以与任何迭代的hash算法组合使用,例如MD5SHA1HMAC还使用一个密钥来计算和验证消息的认证值,采用这种构造的原因:

  • 不加修改的使用已有的hash函数;
  • 保持hash函数的原始性能而不引起显著的退化;
  • 以简单的方式处理和使用密钥;
  • 基于对底层hash函数的合理假设,对身份验证机制的强度进行易于理解的密码分析;
  • 找到或者需要更快或者更安全的hash函数时可以快速替换;
阅读全文

 SHA1算法详解

 SHA1算法详解

SHA1算法作为摘要算法的一种,被使用于各种签名、摘要等场景,本章我们详细分析下SHA1算法细节;

术语定义

  • word:32bit的String,可以表示为8个16进制的序列,例如A103FE23;
  • integer:表示 0-2^32-1 之间的数字;
  • block:表示512bit的String,一个block可以表示为16个word的序列(数组);

消息填充规则

对于待摘要的消息M,先填充一个 bit 1,然后填充N个 bit 0,最后填充 64bit 的消息M的长度信息(单位bit),最终需要满足以下条件:

  • (消息M的长度 + 1 + N + 64) % 512 = 0; PS:消息M的长度单位是bit;
阅读全文

Innodb之快照读原理实现

作者:南乡清水 

1 Innodb MVCC组成

1. 1 为何使用MVCC实现快照读

innodb存储引擎的快照读是基于多版本并发控制 MVCC 和 undolog 实现,通过 MVCC 机制提高系统读写并发性能,快照读只发生于 select 操作,但不包括 select … lock in share mode, select … for update    

  • 提高并发的思路

并发数据一致性通常实现: 锁 + 多数据版本
提高并发读的思路: 通过共享锁保证读读并发,独占锁实现读写互斥
提高并发读写的思路: 一致性折衷,通过数据多版本控制,读使用快照版本,读写不互斥,提高读写并发能力

阅读全文

JDK17都出来了,你还在用JDK8?

 JDK17的一些新特性

本文旨在介绍一些JDK17的新特性,同时限于篇幅,本文仅列举其中一些差异,而不是全部差异;

PS: JDK17是Java的一个LTS版本(长期支持版本),可以放心迁移过来;

阅读全文

return top