- 博客(36)
- 资源 (6)
- 收藏
- 关注
原创 【百亿级数据平滑迁移】底层存储mongo迁移到mysql
去年底,我们完成了持续半年的mongo迁移mysql的动作,这是我在公司来做的持续时间最长,细节涉及最多,灰度切量最细的项目,持续时间长,有很大原因是在做技术升级时,业务需求一直也不断,相当于在给奔跑的汽车换轮胎,车不能停,轮胎边跑边换。 说下我们当前的数据量,涉及到的系统为库存域的业务系统。其中mongo 为6个分片部署,每个分片一主两从:以上数据为一年的数据量,mongo每天都会执行清理程序,保留近一年的数据,单依然数据量很大不支持事务并发量高时性能差熟悉mongo运维的人少。
2024-10-17 23:34:00
922
原创 【mysql】使用AbstractRoutingDataSource实现多数据源 与 获取mapper上注解
随着业务发展速度越来越快,数据的增长也呈现倍数级别增长,数据库的压力,对于查询和写入等所有操作,都依赖于主库,其实有一些对于时效性要求不高的场景,无需使用主库查询,可以使用从库来分摊主库的压力,提升数据库集群整体的吞吐量。
2024-10-09 22:23:24
1054
1
原创 从零开始设计开发优惠券系统(四)
从零开始设计开发优惠券系统(四)概述本章节主要讲优惠券链路的黄金流程,喜闻乐见的领券。领券是营销过程中用户参与度非常高的一种行为,领用的券可以作为现金或者打折的方式直接抵扣支付现金,实打实的能够得到优惠,在促活和拉新场景下作为常见的手段来使用。在成本cover住的情况下,能够实现平台和用户的双赢。核心关键点1.限制流量1.1 限制刷子流量设计领券的流程最先考虑的一定是限制流量,领券是直接能面对消费者的,也就是,任何一个人如果有基本的技术,都可以通过反编译或者解析调用链接来进行刷券请求,也就是
2022-05-12 19:57:36
1787
2
原创 mongo配置查询从库
背景mongo主库现在分片较多,十几个集合表,共计上百亿数据,查询的量比较大,cpu和内存的压力也越来越大,为了更好的利用好mongo,决定使用mongo从库进行常规的查询,减轻主库的负担。介绍基本配置说明mongo读写规则在mongo中的概念为 Read Preference,可以理解为读偏好,或者读配置。官方文档:https://docs.mongodb.com/manual/core/read-preference/下图解释 了一些策略模式读配置模式描述primar
2021-12-23 15:13:45
2135
原创 Spring mvc 接入 shardingsphere5.0.0 自定义表分片规则
背景最近在搞数据迁移,之前存储的介质为mongo,集团层面在推动mongo下线,所以迁移到mySql是主流趋势,mongo目前共6分片,总数大概40亿左右,mySql承接的话,设计为32个库,每个库128个表。数据库的分片,中间件团队已经做了,我们需要处理的是路由到表这块的处理前置官方资料https://shardingsphere.apache.org/document/ 选择5.0.0版本进行阅读使用Spring boot 能很快结束开发,使用Spring mvc实属无奈,但是旧系统升级重构
2021-12-22 17:07:02
4954
11
原创 从零开始设计开发优惠券系统(二)
优惠券1. 模型梳理我们将整个优惠券系统细分为7个大的模块Domain:领域服务相关Dao:数据库连接相关JOB:定时任务相关Rpc:外部调用相关定义SPI:rpc的分类实现Common:通用工具类等与业务无关的操作API:对外开放的接口,如查询、领券等操作Application:系统内部除领域服务外的一些应用服务,包括Api的实现以及业务逻辑层实现web:web模块没有列到服务中心,作为控制层的界面展示,放到了单独的模块,方便前后端分离,与中心端通过RPC协议进行通信2. 券能力
2021-03-30 13:27:16
1865
原创 从零开始设计开发优惠券系统
什么是优惠券系统说到电商平台上,无人不知优惠券体系,它是一种常见的促销方式,在规定的周期内,购买对应商品类型和额度商品时,下单结算时会减免一定金额。不过要注意的是优惠券系统和营销系统是不同的,营销系统中的各种营销活动或者营销工具,对于优惠券来说是不同的分发场景。优惠券业务诉求从多个角度来分析,我们到底需要什么样的优惠券系统目标人群从目标用户群里来看,我们可以将券分为两个大类1. 非定向优惠券:这两个业务的主要区别在于目标人群是否确定,我们可以发现,在多数电商平台,我们每个人都能领取的券,可以说
2021-03-25 13:54:37
3654
4
原创 Intellij IDEA 自动清除无效 import 和一键全量清除无效import引用
为什么突然想到需要这样的东西公司最近Sonar增加了规则扫描28761 Useless imports should be removed这样一来,会导致坏味道大量增加,但是都分散在各个类中 ,一个个改太费时间。当然IDEA帮我们已经实现一键清除无效import引用了。如何设置在当前项目下会自动清除无效的import,而且这个是随时自动清除的。一键清除无效引用选中最外层的Pa...
2020-02-21 16:43:35
15026
1
原创 【DDD】领域驱动设计中的限界上下文
【DDD】领域驱动设计中的限界上下文 承接上文,我们知道了,在确定好研究的领域后,我们可以进行粗粒度的拆分,可以将领域拆分成不同的子域,不同的子域又承担着不同的业务职责,根据重要性,可以将子域分为 核心域、支撑域和通用域,一般来说,我们要将重点放到核心域的开发与集成上。 在DDD中,一个领域被分为若干子域,领域模型是在特定的场景中来设计的,这个场景固定了业务的范...
2020-02-15 22:08:23
2754
原创 【DDD】领域驱动设计中的子域、核心域、通用域、支撑域
引言 对于我们认识一件事情来说,如果想要快速的学习,搞懂其内部核心思想,统一语言是一件很重要的事情。比如我们做敏捷开发,我们应该知道敏捷看板是什么东西,scrum master是什么角色,比如我们做C4Model,我们要知道什么叫做系统上下文,什么叫容器 ,知道了这些领域名词能够更好地让我们去学习,去深入理解。重点词汇...
2020-02-06 21:01:12
8368
原创 【DDD】领域驱动设计是什么?
最近几年,微服务的设计思想,架构方案非常流行,能够很大程度上保证我们的高性能和高可用,可是微服务设计过程中往往会面临边界如何划定的问题 ,这个时候就需要一种理论指导,这时候来自2004年 埃里克・埃文斯(Eric Evans)的 领域驱动设计 理论能够帮助我们更好的进行拆和分,也是微服务架构实践中非常核心的一部分。 本着深入理解的态度,本文章要作为一个专栏来进行编写,作为2020年开篇的文...
2020-02-04 22:04:54
3345
转载 【DDD】贫血模型和领域模型区别
前言:最近公司架构师一直在组织关于DDD的培训,也正在研读《领域驱动设计》一书,也在新项目中逐步实践,但是感觉领域驱动很抽象,其实好多项目在做的时候,我发现虽然整体的架构设计,都把领域模型单独提出来作为一个单独的模块去编写、实现,但是具体的实现内容还是相对较为简单,比如 存放一些pojo,在manger层做一些关于事务的处理,但是核心业务还是写在和service层,这样编写出来的模型,是典型的贫...
2019-11-10 00:34:52
1744
原创 【监控】JavaMelody In Action
JavaMelody In Action前言:在项目的实际运行过程中,我们想知道项目具体运行情况到底是怎么样的,比如,我们关心java虚拟机使用的内存是多少?执行sql的数量及单个sql执行的时间是怎么样的?http 请求有没有错误?定时任务有没有按时触发 …等等,但是,大多数情况这些消息对我们是透明的,我们也很难根据项目的实际运行情况进行针对性的优化。这也就导入了我们今天的主题JavaMel...
2019-05-27 21:07:01
523
原创 RentrantReadWriteLock源码解析
ReentrantReadWriteLock源码解析在这之前的好久,写过一篇关于用友如何实现并发处理的文章,文章结尾谈到了共享锁和排它锁,由于比较懒,最近几个月都没有更新博客,今天良心发现,赶紧补上。ReentrantReadWriteLock类图根据类图,我们首先可以清楚的看到,读写锁内部维护了一个ReadLock和一个WriteLock,他们一来Sync实现具体的功能,而Sync继承了...
2019-03-31 21:34:04
348
原创 【网络编程】BIO、NIO的理解与实例
我们一般情况下,不会涉及到网络编程,大部分成熟的框架,已经对于底层的网络通信进行了支持,但是越是透明化的东西越会让人感兴趣。网络编程在编程中占有举足轻重的位置,任何大型的系统不管是运行在局域网还是广域网都会涉及到网络的信息传输,那么我们简单来了解一下JAVA JDK 关于网络传输的一些相关处理和支持。首先简单定个性BIO(Blocking IO): 同步阻塞 NIO: (Non-Blo...
2018-09-21 23:04:07
773
转载 【多线程】ThreadLocal的解惑
首先,我没有用过ThreadLocal类,前几天被问及相关使用场景和实现原理,一脸懵逼,只知道是本地线程,所以特学习一下相关的知识由于水平所限,欢迎批评指正什么是ThreadLocal引用百度百科的解释:早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多...
2018-09-09 21:16:16
278
原创 【网络编程】TCP/IP协议详解
在绝大多数的场景,我们不会去直接看到或对TCP/IP协议深入探讨,因为大部分的架构会透明化这种底层协议并加以支持,很多情况下,我们只需要配置就能够使用TCP/IP协议进行网络的传输,例如可能你曾经使用过JAVA SOCKET编程,它就是使用了TCP/IP协议进行的网络传输,可是你需要真正理解TCP/IP协议了吗?这些内容都比较偏理论了,需要好好研读。学习TCP/IP协议之前,首先我们要知道OS...
2018-08-22 16:43:54
1575
原创 【多线程】深入浅出synchronized关键字
深入浅出synchronized关键字对于synchronized,大家也并不陌生了,synchronized的使用先写个例子package UseSync;public class SyncDemo implements Runnable { static int wangzy = 0; public static void main(String[] ...
2018-08-19 15:34:36
330
原创 深入浅出volatile关键字
深入浅出volatile关键字为什么会存在volatile这个关键字?也就是说volatile关键字存在的意义是什么?我们首先要知道,无论何种语言要执行下去都要解释为CPU能识别的指令,但是CPU在执行指令的时候,需要对数据进行运算操作,那数据是从哪取出来的呢?我们大家都比较了解的相关硬件是内存。我们知道CPU的运算速度很快的,但是从内存中读取和写入数据的速度却是比较慢的。如果...
2018-08-18 23:37:55
219
原创 【Spring Boot】第一个SpringBoot项目
第一个SpringBoot项目最近对spring boot 很感兴趣那么,我们直接做个Demo出来吧,照例Hello World本博文使用IDEA IDE读本文之前应有spring和meven的一些经验 本着最简单的原则,直接到Spring 官网下载一个Demo,当然可以用自己的IDE新建一个meven项目,把SpringBoot依赖加入进去官网地址如下:https://s...
2018-08-16 13:52:18
1094
原创 【多线程】FutureTask 简单探索及应用
FutureTask 简单探索及应用之前接触过Future模式,是在业务处理费时费力时出现的一种解决方案,可是一直没有时间深入了解其实现方式,今天从FutureTask开始来研究具体实现。首先我写了一个demo public class FutureTaskDemo { public static void main(String[] args) throws Ex...
2018-08-13 17:27:10
305
原创 【NC】NC6系列金额计算处理逻辑剖析
对于ERP系统来说,管控的是整个企业的业务和财务数据,实际生产和运行过程中,除了尾差外,我们不允许出现任何形式的的数据运算错误,所以也就对系统的计算提出了很大的挑战。单方面的加减乘除,对于任何系统来说都很轻易完成,加上精度计算,也不太费力,但是现在如果有一个业务场景:一条业务数据,包含无税金额(原币),含税金额,数量,税率,税额,集团本币(无税,含税,税额),组织本币(无税,含税,税额)汇率,...
2018-07-30 11:55:46
2357
原创 【NC】NC6系列对于并发过程处理的分析
抽点时间分析一下NC6系列对于并发过程处理的分析ERP产品中,并发的场景一般来说比较多出现在多个业务人员操作同一张单据,或者某个业务人员做的操作影响到了其他单据的数据两个人同时做操作,会导致出现并发的问题,也就是在业务层面出现的脏数据。为保证其正确性,1.同一时刻只能有一人修改同一个资源;2.当修改资源的时候需要保证此资源和数据库中的版本保持一致,不能待修改的资源在数据库中已经变化了,也就...
2018-07-25 15:26:20
5029
原创 【NC】简析NC6多语言实现
【NC】简析NC6多语言实现闲着无聊,分析一下多语实现。 一般在使用过程中,我们使用变量的方式来获取数据例如 nc.vo.ml.NCLangRes4VoTransl.getNCLangRes() .getStrByID("4111002_0", "04111002-0021")我们是要通过ID的方式获取字符串的值,返回值可以是中文、繁体中文、英文等根据系统选择的语言来返...
2018-07-23 18:29:37
3502
原创 Dubbo扩展标签及发布服务
DUBBO 扩展标签及发布服务首先,基于Spring做标签的扩展,首先有两个,一个是NamespaceHandler的实现,在xml配置中,要给xml定义一个NameSpace,当然这是Spring的代码处理逻辑,也就是规范,没有为什么,人家Spring的代码就是这么处理的我们可以看到 http\://code.alibabatech.com/schema/dubbo=com...
2018-07-22 19:00:28
501
原创 HashMap内部实现原理
HashMap内部实现原理在存储数据的时候,我们一般用数组或者链表来实现,不说数组和链表的效率问题,数组和链表都有其局限性,数组取值的时候是根据Index来找到对应数据,这个时候我们猜测一下,HashMap内部存储是数组加链表的方式来实现的。查找HashMap的源码(先分析JDK 1.7)先从get(key)方法中查找 /** * Returns the value...
2018-07-12 15:52:51
747
原创 【ZOOKEEPER系列】Paxos、Raft、ZAB
ZOOKEEPER系列Paxos、Raft、ZABPaxos算法莱斯利·兰伯特(Leslie Lamport)这位大牛在1990年提出的一种基于消息传递且具有高度容错特性的一致性算法。如果你不知道这个人,那么如果你发表过Paper,就一定用过Latex,也是这位大牛的创作, 具体背景直接维基百科就可以,不深入讲解,直接讲Paxos算法。分布式系统对fault tolore...
2018-07-11 12:09:49
5922
原创 【ZOOKEEPER系列】分布式架构与一致性协议
ZOOKEEPER系列分布式架构与一致性协议首先了解分布式架构先要知道什么是分布式系统 根据经典分布式领域的著作《分布式系统概念与设计》一书中指出,分布式系统是:一个硬件或者软件组件分布在不同的网络计算机上,彼此之间通过消息传递进行通信和协调的系统严格的将讲,同一个分布式系统中的计算机在空间部署上是可以随意分布的,这些机器可能被放在不同的机柜上,也可能在不同的机房中,甚至分...
2018-07-08 01:28:26
462
原创 【ORM】怎样自己写一个ORM框架-2
接上文,我们获取到了连接,需要封装成查询类进行查询操作我们就叫它BillQueryBillQuery举个栗子,我们通过主表主键来执行查询操作。其实保证唯一性我们规定:public class BillQuery实例化的时候必须要使用泛型, public BillQuery(Class<E> clazz)构造参数必须传入对应的class 每个pojo都是基于元数据...
2018-07-05 16:59:17
1297
1
原创 【ORM】怎样自己写一个ORM框架-1
最近一直在看一些Spring JDBC 的一些东西,觉得吧手动的方式真的不太习惯,而MyBatis需要配置Mapping,虽然更加灵活了,也不简单,hibernate 基本上可以实现单表Nosql但是比较重量级。纠结了这么长时间,还是现在用的的ORM框架比较好用。 我们一般的默认都是 约定优于配置 也就是说我们的规范更加重要,比如说为什么我们的JAVA类命名规则是驼峰,接口或者实现类加上I或者I...
2018-07-05 16:54:44
2149
1
原创 【Spring源码阅读】2.AOP部分具体实现原理
学习任何一个框架也好,源码也罢,首先要找到入口,才能深入 Spring AOP类图镇楼 首先我们先从实现类开始走起ProxyFactoryBeanpublic class ProxyFactoryBean extends ProxyCreatorSupport implements FactoryBean<Object>, BeanClassLoad...
2018-07-05 01:19:41
242
原创 对于静态工厂的一些理解(读Effiective Java笔记)
由于之前一直在印象笔记中编写,现放到csdn上,算是一个学习的记录吧。创建类的实例的最常见的方式是用new语句调用类的构造方法。在这种情况下,程序可以创建类的任意多个实例,每执行一条new语句,都会导致Java虚拟机的堆区中产生一个新的对象。假如类需要进一步封装创建自身实例的细节,并且控制自身实例的数目,那么可以提供静态工厂方法。例如Class实例是Java虚拟机在加载
2017-07-27 14:37:45
503
NC AOP 方式的描述和使用
2017-07-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人