blog
blog copied to clipboard
个人技术博客,博文写在 Issues 里。
> 从百万到亿级,得物触达策略平台是如何做的?:https://mp.weixin.qq.com/s/GYtV83spvKV1BON7zim_LQ ## 1. 简述 触达策略这几个字听起来比较抽象,刚开始听到并不能直接理解。简要描述下,触达策略的核心是任务。首先配置任务,任务下有策略,策略下有行为,行为可以发送push推送、发放优惠券、发送消息盒子、发送短信等。然后等到任务执行时间,执行任务下所有行为。 蓄水池是提升触达策略平台算法推送能力的实现,为算法亿级数据推送能力提供了技术支持。 ## 2. 得物触达策略平台 得物触达策略平台是通过用户的诸多特征划出一批用户,然后到指定时间执行给用户发送push,短信,消息盒子等行为的系统。主要由任务、策略、行为、蓄水池、文案池等组成。接下来将通过“任务主体结构图”和“任务执行结构图”来介绍。 ### 2.1 任务主体结构图 图片 通过这张图可以简单的看到,任务下有策略,策略下有行为,通过策略下的行为来实际执行对应的push推送。
> Spring Cloud优雅下线+灰度发布: https://mp.weixin.qq.com/s/IBPljL1iKuSoCHCkmQ453A
> 转载自【得物技术】看完这篇异地多活的改造,我决定和架构师battle一下:https://juejin.cn/post/7104199746826272775
> 转载自【InfoQ】阿里巴巴正式开源自研动态非侵入AOP解决方案:JVM-Sandbox:https://mp.weixin.qq.com/s/Nn7Yl6UzRpWnSleKUss8Sw ## 写在前面 随着软件部署规模的扩大,系统的功能的细化,系统间耦合度和链路复杂度不断加强。若要继续保持现规模系统的稳定性,需要实现并完善监控体系、故障定位分析、流量录制回放、强弱依赖检测、故障演练等支撑工具平台。出于对服务器规模和业务稳定性的考量,这些配套工具平台要具备对目标应用具有无侵入、实时生效、动态可插拔的特点。 要实现这些,多少都会触及到一块底层技术——动态字节码增强。如果每个工具都自己实现一套字节码增强逻辑,前期实现的门槛与后期维护成本高,且不同工具间相互影响造成不可预知的风险。如何屏蔽字节码增强技术的高门槛,降低研发运维成本,同时又能支持上层多个工具平台功能的快速实现和动态管理,成为阿里集团的目标。从去年开始潜心修行,创新的研发了一套实时无侵入的字节码增强框架。 于是 JVM-Sandbox 诞生了!
错误运行'Application ': org/apache/batik/constants/XMLConstants
> 【转载】Spring Events:https://www.baeldung.com/spring-events ## 1、使用示例 ## 2、Spring事件通知原理 **本文基于spring-context 4.3.30.RELEASE 版本源码分析** ### 2.1 ApplicationEventMulticaster初始化 首先我们跟踪publishEvent方法,这个方法在AbstractApplicationContext类中。 ``` @Override public void publishEvent(ApplicationEvent event) { publishEvent(event, null); } @Override public void publishEvent(Object event) {...
Spring ApplicationListener 是Spring事件机制的一部分,与ApplicationEvent抽象类结合完成ApplicationContext的事件通知机制. 如果容器中存在ApplicationListener的Bean,当ApplicationContext调用publishEvent方法时,对应的Bean会被触发(**默认是同步**)。这一过程是典型的观察者模式的实现。 其中spring有一些内置的事件,当完成某种操作时会发出某些事件动作。比如监听ContextRefreshedEvent事件,当所有的bean都初始化完成并被成功装载后会触发该事件,实现ApplicationListener接口可以收到监听动作,然后可以写自己的逻辑。 同样事件可以自定义、监听也可以自定义,完全根据自己的业务逻辑来处理。 ## 内置事件 | 序号 | Spring 内置事件 | 事件描述 | | ----- | ----- | ----- | | 1 | ContextRefreshedEvent | ApplicationContext 被初始化或刷新时,该事件被发布。这也可以在...
## 一、使用场景 实现SmartInitializingSingleton的接口后,当所有单例 bean 都初始化完成以后, Spring的IOC容器会回调该接口的 afterSingletonsInstantiated()方法。 主要应用场合就是在所有单例 bean 创建完成之后,可以在该回调中做一些事情,例如: ## 二、原理分析 在Spring容器启动时,通过SpringApplication.run()-->SpringApplication.refreshContext()-->SpringApplication.refresh() -->AbstractApplicationContext.refresh(),在这个refresh()函数过程中会调用 finishBeanFactoryInitialization(beanFactory)来提前初始化单例bean,具体方法是调用beanFactory.preInstantiateSingletons(),而这里的beanFactory实例实际为接口 ConfigurableListableBeanFactory 的实现类DefaultListableBeanFactory的实例对象。 查看到DefaultListableBeanFactory.preInstantiateSingletons()的源码如下: ``` @Override public void preInstantiateSingletons() throws BeansException { if (logger.isTraceEnabled()) { logger.trace("Pre-instantiating...
今日值班收到线上告警 如下(部分删减) ``` [P1][故障][机器指标][集群:xxxx] [告警名称:jvm.thread.blocked.count] [告警指标:jvm.thread.blocked.count] 告警机器:set-xr-xxx-trans39 ([192.168.88.99]) 最近1个点值:[116] 触发规则: [过去1个点内,所有点的值 >= 100 ] ``` 赶紧去查看了那台机器的堆栈信息: ``` http-nio-8080-exec-177" #441 daemon prio=5 os_prio=0 tid=0x00002ae00812e800 nid=0x6183 waiting for monitor entry [0x00002ae042f6b000] java.lang.Thread.State:...