- 博客(121)
- 收藏
- 关注
原创 基于DDD开发的KYC用户实名认证
│ 3. Service 层变薄 │ Service 100+ 行混杂所有逻辑 │ Service 只负责协调,15 行搞定 │ 省 85 行 │。│ 1. 验证规则集中 │ 年龄验证在 10 个地方重复 │ 在聚合根中写一次,到处复用 │ 省 30-50 行 │。throw new KycDomainException("只有审核中的申请可以批准,当前状态:" + this.status);
2026-01-29 10:25:56
476
原创 Sumsub-kyc认证接入
创建回调钩子Sumsub的网络钩子类型(Webhook Type)是指不同类型的通知事件分类。当你在Sumsub后台配置Webhook时,需要选择你希望接收哪些特定类型的事件通知。
2025-12-19 15:40:31
986
原创 停车全生态系统-核心停车计费引擎+发券
您是对的。本地基础费用计算器。职责单一,结果确定。云端优惠费用计算器。职责复杂,依赖网络。当云端服务不可用时,降级策略是“在无法获得优惠信息的情况下,如何继续进行业务”,而不是“试图在本地完成云端的职责”。最常见的降级就是放弃优惠,按基础费用结算,事后再通过运营手段进行补偿。这保证了系统在异常情况下的最基本可用性。
2025-10-14 17:17:35
542
原创 停车全生态系统架构
技术栈基石是 C++:在需要直接、高效、稳定地控制硬件的领域,C++因其无与伦比的性能和控制力,依然是无可替代的“重器”。架构是混合的:以C++为核心,周围环绕着用其他更适合快速开发的语言(如Go, C#)编写的辅助服务,共同构成一个完整、稳定、高效的本地系统。选型哲学:这种技术选型体现了经典的软件工程思想——“用合适的工具做合适的事”。在性能和控制力是首要需求的底层,选择C++;在业务逻辑和运维效率是首要需求的上层和云端,选择Java/Go/Python。
2025-10-13 16:15:32
847
原创 停车管理系统-后端系统架构设计和核心模块的开发
崩溃类型问题根源TTL的防护机制资源型崩溃内存泄漏,Redis内存耗尽自动清理:为数据设置生命周期,到期自动删除,释放资源。业务型崩溃进程挂掉导致锁等关键资源永不释放超时释放:作为安全网,强制释放资源,让其他进程可以继续工作,保证业务流通。逻辑型崩溃脏数据长期存在,导致业务逻辑错乱数据保鲜:确保数据不会“永垂不朽”,系统有机会自动或手动恢复到一致状态。所以TTL不仅仅是一个资源清理工具,更是一种重要的系统容错和稳定性设计模式。
2025-10-13 10:25:59
786
原创 停车计费系统-核心要点
入场无出场”漏单的处理,是一个“技术为主、人工为辅”的侦探过程。其核心在于利用出口抓拍图像这一关键证据进行反向匹配。为了减少此类漏单,停车场会采取以下预防措施:优化识别算法:提高车牌识别的准确率,尤其是在夜晚、雨雪天气。安装冗余摄像头:在出口通道不同角度安装多个摄像头,避免因车辆跟太紧或被遮挡而漏拍。强制支付抬杆:除非系统故障,否则必须检测到支付成功信号后才抬杆。规范人工操作:所有手动抬杆必须记录原因并强制输入车牌号,以便后续核查。
2025-10-11 13:11:00
1198
原创 Deepseek-财务系统学习
业务事件财务本质系统自动完成的动作发放贷款资产形态转换借:应收贷款贷:银行存款每日计提确认应计收入借:应收利息贷:利息收入用户还款资产权利变现借:银行存款贷:应收贷款 & 应收利息给你的启示:财务不是事后记账,而是与业务同步发生,深度嵌入业务流程。财务语言(分录)是描述业务实质的“翻译官”。自动化是生命线:没有系统自动化,面对海量交易,人工根本无法完成如此精细、及时的核算。这趟初体验之旅旨在让你感受到,财务板块是信贷业务的“数字心脏”,它每一次跳动(生成分录),都真实、准确地记录着业务的生机与活力。
2025-10-11 09:52:31
1083
原创 Deepseek-支付技术学习
收单机构是为商户提供支付受理服务并完成资金结算的持牌金融机构。它的核心工作是:为商户安装和维护收款设备/系统。处理支付交易,将消费者的钱从付款账户划走。将结算资金打入商户的银行账户(这个过程叫“清算结算”)。承担交易风险和处理纠纷。银行:如工商银行、招商银行,为大型商户提供收单服务。第三方支付公司:如拉卡拉、银联商务、通联支付等,是中小商户的主力收单方。网联:全称“非银行支付机构网络支付清算平台”。它主要负责处理支付机构(如支付宝、微信)相关的网络支付业务,是“断直连”后为支付机构专门设立的枢纽。
2025-10-10 22:14:00
348
原创 消费金融系统-风控系统
风控出额的具体规则是一个由数百个甚至上千个逻辑条件组成的、动态变化的、高度机密的复杂系统。从定性到定量:先将用户分类(如优质、中等、高风险),再定量计算额度。从否定到肯定:先用人人平等的硬规则排除高风险用户,再用精细化的软规则奖励好用户。动态调整:规则不是一成不变的,会根据宏观经济、业务数据和坏账情况不断进行策略调优。希望这个详细的分解能帮助您真正理解“风控出额的具体规则”是如何运作的。信用评分模型好的,我们来深入探讨信用评分模型。
2025-10-10 08:58:18
993
原创 消费金融系统-利息核算与财务核算
这里开始详细解析一下金融业务中(特别是信贷领域)核算系统(这里指财务核算)的基本流程。核算系统,通常也称为核心账务系统或总账系统,是金融机构的“会计大脑”。它负责准确、完整、及时地记录所有金融交易引起的财务变化,是生成财务报表、满足监管要求的基础。其核心目标是遵循“有借必有贷,借贷必相等”的复式记账法原则。简单来说,核算就是会计记账。每一笔业务交易(如用户提现、用户还款、支付利息等)在核算系统中都会体现为一个或多个会计分录。会计分录:包含借方科目和贷方科目,以及金额。借方。
2025-10-09 12:16:10
981
原创 面试场景题-
如果不是CPU,内存等资源瓶颈,导致的性能问题,那么就可能是数据库,比如数据库行锁竞争顺丰一面:订单服务调用时间从200ms飙升至1.5s,如何排查?Java面试前一定要看看!_哔哩哔哩_bilibili。
2025-10-02 23:54:15
334
原创 Netty-02-
Netty的异步,指的是发起请求调用的线程,和处理响应结果的线程,是两个不同的线程。如果发起发起请求调用的线程,和处理响应结果的线程是同一个,那就是同步处理上面的ChannelInitializer#initChannel(channel),只有连接建立好后,才会执行的连接的初始化的动作执行流程一个channel一定要绑定一个selector(一个EventLoop就是一个工人,每个工人内部都有一个selector),这么做的目的是为了线程安全。
2025-09-15 18:48:48
567
原创 Netty-01-NIO前置知识
NIO三大组件:Channel、Buffer、SelectorSelector适合channel连接数特别多,但是每个channel上来回的流量低的场景int count = channel.read(buffer),如果返回-1,表示channel中的数据读取完毕了。
2025-09-15 09:51:09
450
原创 RocketMQ源码级实现原理12-remoting模块分析
正常如果 broker调用了channel.close()关闭了连接,nameserver的epoll会收到一个Read事件,nameserver的事件read线程,去调用int count = channel.read(buffer),会得到count返回的-1,从而nameserver就知道某个broker与它之间的长连接断开了。
2025-09-11 17:15:32
221
原创 RocketMQ源码级实现原理05-文件恢复、过期文件清理
commitlog写入后,ConsumeQueue的构建是异步的,所以没有办法刚开始就保证强一致如果ConsumeQueue有一部分commitlog没有的数据,那么这部分数据就是脏数据,那么就要把这部分数据删掉所有的文件大小,因为要方便做内存映射,所以所有文件的大小都是固定的。
2025-09-11 10:13:06
259
原创 面试可能问到的问题思考-Redis
一般不太会考虑redis连接池的问题,配合5,10之类的,都没有太大问题,只有在高并发的情况下,可能会因为连接池争抢,导致程序阻塞。生产上,可以配20甚至更高,以此来应对高并发情况。
2025-08-21 17:32:47
461
原创 RocketMQ源码级实现原理-消息重试、定时消息、批量消息
延迟避退可以根据这个实现逻辑,本质就是一个分段函数,实现一个根据线程池中任务数,决定往线程池写任务时,阻塞多长时间如果broker端,返回的响应码是591到595行这几种,是会continue继续重试的,而如果是broker端因为pagecache等锁定太久等原因太繁忙,而返回的SYSTEN_BUSY,是不会进行发送重试的。
2025-08-21 09:00:12
224
原创 网上的一个信贷系统开发
从0开始意味着你要考虑的事情也会更多,比如:最基础的系统设计,技术选型,交互方式,可复用性,可扩展性,系统健壮性,安全性、、、等等一系列问题;所有的核心业务未必就适合于放在一个系统中处理,如贷款的账务处理和贷款的授信、审批以及贷后管理就不适合放在一个系统中,因为账务处理力求稳定和高效,而贷款的流程管理力求灵活多变,不同的功能需求更适合在不同的系统中处理。其实,上面的用户注册、用户绑定、用户认证,都是进件系统来串的流程,CIS系统只是流程上的一个节点,负责维护一下用户的基本信息,用户的认证状态等等。
2025-08-19 08:34:24
649
原创 分布式文件系统06-分布式中间件弹性扩容与rebalance重平衡
当宕机的DataNode-A重新启动后的下一次心跳发送到NameNode时,NameNode就会把这25w个RemoveReplicaTask都下发给DataNode-A,DataNode-A拿到这25w个RemoveReplicaTask后,就会开始执行它们,对应的也就是删除DataNode-A本地的25万个文件副本。某个之前某个宕机的数据节点DataNode-A又重启后,肯定会再次注册,并进行全量上报的流程,此时,就会导致DataNode-A上的文件副本,实际上在整个DataNode集群中存了3份。
2025-08-05 10:10:55
472
原创 RocketMQ源码级实现原理-长轮询与零拷贝
rocketmq提供了一种兜底策略,就是PullRequestHoldService内部的死循环,会每5秒醒一次,醒来后会检查pullRequestTable内部的pullRequest,是否达到了超时时间,如果已经超过超时时间,不管是否有没有满足条件的新消息,都将拿到专门处理PullMessageProcessor相关工作的线程池,在该线程池中创建一个task来调用getMessage(PullRequest,brokerAllowSuppend = false)
2025-07-19 07:05:43
458
原创 RocketMQ源码级实现原理04-Commitlog刷盘机制
写入消息时候写到的是DirectByteBuffer——堆外内存中,读消息走的是PageCache(对于DirectByteBuffer是两步刷盘,一步是刷到PageCache,还有一步是刷到磁盘文件中),带来的好处就是,避免了内存操作的很多容易堵的地方,降低了时延,比如说缺页中断降低,内存加锁,污染页的回写。,这样子读写都在pagecache里面不可避免会有锁的问题,在并发的读写操作情况下,会出现缺页中断降低,内存加锁,污染页的回写。(1)第一种,Mmap+PageCache的方式,
2025-07-18 09:38:15
699
原创 RocketMQ源码级实现原理-消息过滤与重试
2号消息存储的topic为SCHEDULE_TOPIC_XXXX, 一旦2号消息到达了指定的延迟时间后,会被再次取出成为3号消息,此时将2号消息的属性key为PROPERTY_REAL_TOPIC对应的value中保存的topic值 %RETRY%consumer group取出来,设置为3号消息的topic,并将3号消息重新投递到topic为%RETRY%consumer group对应的队列中去。在kafka中是使用了时间轮,进行了更为精确的时间控制。每个专属的延时TimeTask的执行逻辑是,
2025-07-16 20:18:54
955
原创 RocketMQ源码级实现原理07-消息消费总览
之前某位同事,在注册的监听器中,调用了某个公司的某个tcp方法,导致16个队列,就某一个队列不消费了。Consumer端,是有一个ConcurrentMap<MessageQueue,AtomicLong> 的本地缓存,当前消费线程消费的是哪个队列的消息,消费完这一条消息后,无论消费成功还是失败,都会把该缓存的MessageQueue对应的AtomicLong更新为红黑树的firstKey的值,也就是红黑树中的最小消息offset的值(这个值,也就是Consumer端存在本地的消费进度值)
2025-07-15 22:58:49
742
原创 RocketMQ-系统学习
可以看到默认broker的最大内存和最小内存就是8G,如果虚拟机的内存不足8G,那么./mqBroker启动broker就会报错。所以需要把这几个参数值改小一点。默认不加参数,就是启动broker,并直接在本机中找nameserver进行注册,我们也可以在启动时制定往哪台nameserver上连接。这个broker对应的jar包启动时,传入到启动方法中的JVM参数。提示找不到node-01这个主机名对应的ip地址。
2025-07-12 21:54:16
248
原创 基于社区电商场景的Redis缓存架构实战02-社区电商项目实战
美食社区APP,专门提供给别人来分享、浏览和社交活动,APP没法盈利,在这个里面会有一些人是产出的内容特比的优质,很多人来浏览,粉丝,读者,关注人,分享的东西,浏览量是非常大的,种草,发出来一个美食食谱和做法的帖子,你可以推荐一下某款酱油、某款味精,他的好处和优点,种草APP 提供,浏览你的帖子的人,他看到你推荐的商品,可以点击一个商品链接,直接进入商品详情页里去,浏览一下这个商品介绍,可以把这个商品加入自己的购物车里去,就可以直 接发起交易,完成商品购买。redis 完整的项目实战。
2025-06-28 11:03:18
297
原创 基于社区电商场景的Redis缓存架构实战01-redis内核知识
当你手头有大量的客户端来并发访问的时候,server端里就可能会有大量的socket 可以多个线程,也可以一个线程,bio模式下,一个socket连接,server端就对应了一个线程来进行监听他的请求,java nio模式下,可以实现IO多路复用,一个线程,就可以多路复用去监听多个socket 的网络事件(请求发送过来)redis基于文件事件的网络通信模型 file event,网络事件,抽象为文件事件,在redis server内部,网络通信各种事件,其实都是一些文件事件 Socket 概念。
2025-06-27 16:21:40
380
原创 面试可能问到的问题思考-杂记
简单的方案就是,更新操作时,先更新数据库,再删除缓存。这种方案的弊端是,线程一更新了数据库还没来得及删除缓存时,线程二过来读到的缓存是旧的数据。不能先删除缓存,再更新数据库,因为线程一删除了缓存还没来得及恒心数据库时,线程二过来发现缓存没有就读了数据库的旧数据并写入缓存,后续所有的线程都会读这个旧的数据。考虑redid做缓存时,必然就必须容忍一定的数据不一致的可能,考虑让redid做数据库我没用过。关于数据库与缓存的一致性问题。
2025-06-21 10:34:55
159
原创 金融里面的那些事儿
发行用户使用的银行卡的银行叫发卡行,发行商户使用的pos机的银行叫收单行,用户刷卡支付的时候,收单行先将资金垫付给商户,事后再统一找发卡行要回来,这样一来收单行和发卡行便产生了债权债务关系。用通俗的话解释,清算就是有两方因为某项合作业务,合作形式是先完成交易事后进行支付,导致一方欠了另一方一笔钱,形成债务关系,并最终通过某种方式偿还了这笔钱的过程。第二步是结清关系,根据计算出的应收应付结果,完成资金交割转移,结清债权债务,这一步专业叫“里面有通过发卡行与收单行的例子,解释清算的由来,以及银联的由来。
2024-07-23 21:36:49
389
原创 关于大数据技术栈的一些总结
它就是hadoop,因为hadoop它是开源的,然后阿里、CDH、CDP等等大数据平台厂商,他们就是再去把它封装,封装的更好用一点,那我们就省的去去安装hadoop、安装Spark,安装hive、然后还要考虑他们的兼容性啊,系统的兼容性啊,还要提升他的计算效率呀,这些都厂商来处理,因为这些他们很专业,就是相当于他是专门就是做大餐的,然后我们自己做一顿就没那么好吃。市场上都是把菜把米都做好了,就我们买回来,然后去炒菜就可以了,这种都是他们都是高效低成本,然后专业化的,那我们再自己去搞一套就。
2024-07-19 23:38:46
434
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅