CausalMMM:基于因果结构学习的营销组合建模
1. 摘要
在线广告中,营销组合建模(Marketing Mix Modeling,MMM) 被用于预测广告商家的总商品交易量(GMV),并帮助决策者调整各种广告渠道的预算分配。传统的基于回归技术的MMM方法在复杂营销场景下效果不尽如人意。尽管一些研究尝试使用因果结构进行更好的预测,但它们有一个严格的限制,即因果结构是事先已知且不可改变的。在本文中,我们定义了一个新的因果MMM问题,以自动从数据中发现可解释的因果结构,并得出更好的GMV预测结果。为了实现因果MMM,需要解决两个关键挑战:(1)因果异质性:不同类型广告商家的各渠道间因果关系结构差异很大。(2)营销响应模式:渠道投入对结果GMV的影响,例如在实证研究中发现的衰减效应和饱和效应。本研究认为,因果MMM需要动态地为不同广告商家发现营销行为间具体的因果结构,并且预测结果应符合先验已知的营销响应模式。因此,我们提出了CausalMMM,它在变分推断框架中集成了Granger因果,以测量不同渠道之间的因果关系,并在时态和饱和度营销响应模式的规范化下预测GMV。大量实验证明,CausalMMM不仅可以实现5.7%+的因果结构学习性能提高,在阿里妈妈真实数据上,还可以大幅提高GMV预测结果的准确性,为不同广告商家提供更可靠的GMV预测以及广告渠道间因果关系挖掘。
该项工作由阿里妈妈SDS团队和中科院计算所毕经平研究员与姚迪副研究员团队合作完成,基于该项工作整理的论文已被WSDM 2024接收,欢迎阅读交流。
论文:CausalMMM: Learning Causal Structure for Marketing Mix Modeling
作者:Chang Gong, Di Yao, Lei Zhang, Sheng Chen, Wenbin Li, Yueyang Su, Jingping Bi
下载(↓阅读原文↓):https://dl.acm.org/doi/10.1145/3616855.3635766
延展阅读:CausalMTA: 基于因果推断的无偏广告多触点归因技术
2. 背景
阿里妈妈目前已有丰富的广告产品,包含搜索、展示、直播、短视频、品牌等多种形态。广告主往往会将预算分配在不同广告渠道上,来覆盖用户转化旅程下的不同触点。广告主希望能精确衡量多渠道预算对整体销量的贡献,从而优化GMV、投入产出比(ROI)等目标,形成多渠道间预算投入的最优方案。
营销组合模型(Marketing Mix Modeling,简称MMM)是一种统计分析技术,帮助平台与广告主评估不同营销行为的效果以指导预算规划决策,并提高整体营销决策的有效性。MMM利用平台丰富的营销领域数据来训练模型,衡量各个营销渠道的影响,同时考虑店铺品牌、宏观经济、大盘等对最终转化数据有影响的非营销因素。基于对未来转化情况的预测,为后续广告投放计划提供全局预算调控指导,是在线数字广告系统中一个重要的提效手段。

现有MMM工作大多可以分为两类:基于回归的方法、基于因果的方法。前者[1]基于不同渠道的消耗对GMV做回归,以回归系数解释各渠道重要性程度,但忽视了渠道之间的相互影响,影响模型的解释能力;后者[2]大多从先验知识出发预先定义因果结构,但忽略了不同商铺之间因果结构的异质性,难以用于实际场景中指导决策。因此,从传统MMM出发引入因果发现方法,动态挖掘不同店铺的因果结构,显得尤为重要。

然而,在MMM任务中动态挖掘因果结构并非易事,存在以下挑战:
挑战一:因果异质性(Causal Heterogeneity)
不同店铺特点和不同时期,渠道的因果结构和动态会有所不同。如图2(a)所示,影响销量的潜在因果驱动因素以及营销反应曲线,通常在不同品牌档次和营销事件中是异质的。与男装店铺相比,美妆店铺中品牌广告和页面浏览之间的因果效应更为关键。这种因果结构的异质性,在数据不平衡的情况下更加难以被传统MMM发现。
挑战二:营销响应模式(Marketing Response Patterns)
在前人的研究[3]中,已经验证了广告效果随投入发生响应的几种重要模式,如溢出效应和饱和效应。如图2(b)所示,广告投入的影响会随时间衰减,并随着投入的增加而饱和。除了因果结构,GMV曲线也受到一些背景变量的影响,如经济状况和竞争情况。因此,因果MMM中对预测目标与各变量的关心应该被精细建模,以满足各种营销响应模式。
3. 方法
为了解决这些挑战,我们提出了一种新的营销组合模型,称为CausalMMM,它可以同时处理因果异质性和营销模式,实现因果营销组合模型。总的来说,CausalMMM是一种基于图变分自编码器的方法,由两个关键模块组成:因果关系编码器(Causal Relational Encoder)和营销响应解码器(Marketing Response Decoder)。在因果关系编码器中,我们对店铺的历史数据进行编码,以Gumbel softmax采样生成特定的因果结构。基于因果结构,营销响应解码器被设计为满足营销响应模式的先验条件,并实现良好的预测性能。解码器中集成了顺序模型和S曲线转换,分别捕获了溢出和饱和效应。对于优化,CausalMMM直接用变分推理损失拟合历史数据,以端到端的方式学习参数。此外,CausalMMM具有理论保证,得到的因果结构是格兰杰因果[8]关系,且算法复杂度随店铺数目增加而线性增长。

3.1 因果关系编码器模块 Causal Relational Encoder
因果关系编码器旨在根据历史广告支出和营销目标,推断因果关系的可能性。具体来说,因果结构的联合分布可表示为,其中表示从节点i到j存在一条有向边(即),且i≠j。由于事先不知道潜在的因果结构,我们从一个完全连通的图开始预测因果关系。利用图神经网络(GNN)在完全连通的图上传播信息,预测因果边[7]。因果关系编码器包括三个步骤,即成对嵌入、关系交互和Gumbel softmax采样。
我们首先通过广告消耗-营销目标间的成对嵌入在完全连通图中初始化边表示。成对嵌入的形式如下,这种方式以成对的方式捕捉了营销行为与目标间初始的局部信息:
在关系交互阶段,为了考虑与其他节点的关系交互,即全局信息,我们进一步计算边嵌入,其公式如下:
上述公式可以总结为通过编码器框架来推导结构分布,如下所示:
由于潜在分布是离散的,无法直接通过重参数化技巧进行反向传播学习模型参数,因此在训练过程中我们添加了Gumbel分布噪声[5],来推断因果结构:
3.2 营销响应解码器 Marketing Response Decoder
解码器的目的是在推断的因果结构下建模营销响应,预测最终的营销目标。尽管基于上述推断的因果结构能够建模复杂的因果交互,但其他营销模式仍然不容忽视。营销组合建模中存在两个典型的假设:
时序营销反馈(Temporal Marketing Response):广告渠道的投资具有滞后性和时间衰减效应,即carryover effect。
饱和营销反馈(Saturation Marketing Response):广告渠道的投资收益具有边际递减效应。
如何系统地建模时间和饱和模式是一个不容忽视的问题。在大多数情况下,每个时间段内的渠道消耗相比于历史每个时间点累积的总消耗要更小。因此,我们首先建模时序模式,然后建模饱和模式。如图4所示,营销响应解码器由两个步骤组成,即时序营销响应模块和饱和营销响应模块。

时序营销响应模块 Temporal Marketing Response Module
为了考虑时序特征,我们在原有的GNN消息传递机制中添加了序列模型。即,
其中,前一时间步的循环隐藏状态被用于消息传递机制。是这里使用RNN实现的序列模型,它以、当前值和前一个隐藏状态作为输入,捕捉每个营销变量的时间模式。
饱和营销响应模块 Saturation Marketing Response Module
递减收益对营销决策非常重要,因为它反映了渠道营销投资和目标收入之间的动态响应关系。在这个模块中,我们关注S-curve (Hill)变换[3],这是建模饱和度最广泛使用的方法,我们采用基于梯度的方式来学习变换参数预测下一时刻营销目标。传统上,用于描述渠道对y的饱和效应的S-curve S(·)定义如下:
其中,α控制曲线在指数和S型之间的形状,γ表示响应曲线的拐点。它们的值受广告主、渠道、市场特性的影响。
我们通过神经网络对α和γ进行建模,输入为上下文变量C的向量。这为模型带来了更强的表示能力和可解释性[6],因为包括店铺类型、事件和宏观趋势在内的附加信息可用于确定饱和曲线的形状。具体来说,营销目标的传统S曲线模型扩展为以下形式:
其中,fγ(·)表示用于计算市场拐点的神经网络,fα(·)是一个神经网络,其输出控制曲线在介于指数和S型之间的形状。在这个模块中,神经网络的模型能力和S曲线的显式表达能力被集成在了一起,已互补取得更好的预测效果。
基于上述两个模块,我们可以得出,分别刻画了d维渠道上的营销行为和营销目标的预测值。最终的基于历史的成对时间序列,对下一时刻多渠道、营销目标值的预测概率如下所示:
其中,σ是固定的方差项。对于多个时间步的预测,结果会以递归的方式进行调用预测,即:
3.3 变分优化 Variational Inference for Optimization
这一节给出了基于变分推理的优化过程。上面详述的和的参数可以根据以下内容导出:
且损失函数可以改写为变分下界(variational lower bound):
其中,第一项是拟合数据的负对数似然,第二项是正则化的结构先验分布的KL散度。
4. 实验
本文分别在具有已知因果结构的仿真数据集与阿里妈妈真实数据集上实验。本文对比了CausalMMM模型与7个基准模型的实验情况,基准模型可分为两类,时序因果发现方法:Linear Granger[9],NGC[10],GVAR[11],InGRA[12];以及传统用于MMM与GMV预测的方法:LSTM[13],Wide&Deep[14],BTVC[4]。此外,本文还对比了三个消融方法(CM-FULL,CM-MARKOV,CM-RW)。
图5是不同模型在不同变量数目、不同时间步长、不同因果异质性下因果发现的性能,CausalMMM在三类不同设定下都有更好的表现。
图6是GMV预测的MSE结果,比较了不同预测步长(1步、7步、30步)下各种方法的表现。我们可以观察到:
(1) 在所有比较的方法中,BTVC在M=30时表现最好,这可能归因于它明确引入了趋势和季节性信息的有益作用。
(2) 我们提出的CausalMMM在M=7时取得了最佳性能,在M=1和M=30时也达到了第二好的表现,这体现了该方法的有效性。

图7可视化了在真实数据集中一家美妆店铺学习到的因果结构。我们展示对比了CausalMMM和之前最好方法GVAR学习到的11个营销渠道、页面浏览量(PV)以及营销目标(即GMV)的因果结构。在这些营销渠道中,前六个(即x-brand-0, ..., x-feed)是品牌广告渠道,旨在提高用户的认知和兴趣。相反,剩余的5个(即x-live, ..., x-effect)是效果渠道,用户在这些渠道更可能采取行动并实现转化。我们可以观察到,从品牌渠道到PV,再从PV到效果渠道存在因果关系。这些结果与营销领域专家的知识一致,并且与营销漏斗效应的结论一致。我们的方法还发现了一些有意义的关系,包括x-brand-1到x-search-1/2,表明在外部视频网站投放广告会导致电商平台上的搜索量增加。

5. 总结
MMM模型评估了不同营销行为下的营销效果,能够帮助商家从全局视角优化广告资源投放,从而提升整体营销收益。本文定义了因果营销混合模型(Causal MMM)的问题,该模型推断每个广告商家下各渠道间因果结构,并学习从渠道支出到GMV预测的映射关系。为了建模因果异质性和营销响应模式,我们提出了CausalMMM模型,该模型既能从异构数据中学习因果结构,又能建模营销响应模式。CausalMMM使用因果关系编码器和营销响应解码器。在仿真数据集和电商平台的实际商业数据上的实验结果表明,CausalMMM优于基线模型,并在应用中表现良好。
▐ 关于我们
🏷 阿里妈妈SDS(Strategic Data Solutions)团队致力于用数据让商家和平台的增长战略更加科学有效。我们为阿里妈妈全线广告客户提供营销洞察、营销策略、价值量化及效果归因的技术服务。我们将持续在数字营销领域MTA、MMM等方向进行探索和落地,欢迎各业务方关注与合作。同时,真诚欢迎感兴趣的同学和我们取得联系、互相交流。
联系邮箱:alimama_tech@service.alibaba.com
📝 CausalMMM 是阿里妈妈SDS和中科院计算所毕经平、姚迪老师团队多年合作的共同成果。双方不仅在MTA、MMM等学术领域做出了创新成果,也根据阿里独特的电商业务场景做了针对性的适配和优化,最终在学术研究与实际业务都取得满意的结果。毕老师的课题组围绕时序数据智能、网络智能、AI算法安全等领域开展研究,面向国家权益保障、国家网络与信息安全等国家重大战略需求,承担了多项国家科技重大专项、国家自然科学基金、国防预研项目和研制项目等重大项目。近三年来,课题组在KDD、WWW、ICDE、TKDE、TON等期刊会议上累计发表CCF A类论文十余篇。欢迎感兴趣的同学合作交流。
联系邮箱:yaodi@ict.ac.cn
▐ Reference
[1] Richard Wigren and Filip Cornell. 2019. Marketing Mix Modelling: A comparative study of statistical models.
[2] Aiyou Chen, David Chan, Mike Perry, Yuxue Jin, Yunting Sun, Yueqing Wang, and Jim Koehler. 2018. Bias correction for paid search in media mix modeling. arXiv:1807.03292 (2018).
[3] Yuxue Jin, Yueqing Wang, Yunting Sun, David Chan, and Jim Koehler. 2017. Bayesian methods for media mix modeling with carryover and shape effects. (2017).
[4] Edwin Ng, Zhishi Wang, and Athena Dai. 2021. Bayesian Time Varying Coefficient Model with Applications to Marketing Mix Modeling. In AdKDD'21 Workshop.
[5] Eric Jang, Shixiang Gu, and Ben Poole. 2017. Categorical Reparameterization with Gumbel-Softmax. In 5th International Conference on Learning Representations, ICLR'17.
[6] Kui Zhao, Junhao Hua, Ling Yan, Qi Zhang, Huan Xu, and Cheng Yang. 2019. A Unified Framework for Marketing Budget Allocation. In KDD'19. ACM, 1820–1830.
[7] Thomas N. Kipf, Ethan Fetaya, Kuan-Chieh Wang, Max Welling, and Richard S. Zemel. 2018. Neural Relational Inference for Interacting Systems. In ICML'18, 2693–2702.
[8] Sindy Löwe, David Madras, Richard Z. Shilling, and Max Welling. 2022. Amortized Causal Discovery: Learning to Infer Causal Graphs from Time-Series Data. In CLeaR'22, 509–525.
[9] Andrew Arnold, Yan Liu, and Naoki Abe. 2007. Temporal causal modeling with graphical granger methods. In KDD'07. ACM, 66–75.
[10] Alex Tank, Ian Covert, Nicholas J. Foti, Ali Shojaie, and Emily B. Fox. 2022. Neural Granger Causality. In TPAMI'22, 4267–4279.
[11] Ricards Marcinkevics and Julia E. Vogt. 2021. Interpretable Models for Granger Causality Using Self-explaining Neural Networks. In ICLR'21.
[12] Yunfei Chu, Xiaowei Wang, Jianxin Ma, Kunyang Jia, Jingren Zhou, and Hongxia Yang. 2020. Inductive Granger Causal Modeling for Multivariate Time Series. In ICDM 2020, 972–977.
[13] Sepp Hochreiter and Jürgen Schmidhuber. 1997. Long Short-Term Memory. Neural Comput. 9, 8 (1997), 1735–1780.
[14] Heng-Tze Cheng, Levent Koc, Jeremiah Harmsen, Tal Shaked, Tushar Chandra, Hrishi Aradhye, Glen Anderson, Greg Corrado, Wei Chai, Mustafa Ispir, Rohan Anil, Zakaria Haque, Lichan Hong, Vihan Jain, Xiaobing Liu, and Hemal Shah. 2016. Wide & Deep Learning for Recommender Systems. In RecSyS'16. ACM, 7–10.
END
也许你还想看
丨CausalMTA: 基于因果推断的无偏广告多触点归因技术
丨【阿里妈妈营销科学系列】第六篇:营销组合模型MMM
丨广告营销场景下的隐私计算实践:阿里妈妈营销隐私计算平台SDH
丨开放下载 | 阿里妈妈营销科学系列上线啦!
关注「阿里妈妈技术」,了解更多~
喜欢要“分享”,好看要“点赞”哦ღ~
相关文章:

CausalMMM:基于因果结构学习的营销组合建模
1. 摘要 在线广告中,营销组合建模(Marketing Mix Modeling,MMM) 被用于预测广告商家的总商品交易量(GMV),并帮助决策者调整各种广告渠道的预算分配。传统的基于回归技术的MMM方法在复杂营销场景…...

编译 CUDA 程序的基本知识和步骤
基本工具 NVCC(NVIDIA CUDA Compiler): nvcc 是 NVIDIA 提供的 CUDA 编译器,用于将 CUDA 源代码(.cu 文件)编译成可执行文件或库。它可以处理 CUDA 和主机代码(例如 C)的混合编译。nvcc 调用底层…...

[SAP ABAP] 排序内表数据
语法格式 整表排序 SORT <itab> [ASCENDING|DESCENDING]. 按指定字段排序 SORT <itab> BY f1 [ASCENDING|DESCENDING] f2 [ASCENDING|DESCENDING] ... fn [ASCENDING|DESCENDING].<itab>:代表内表 不指定排序方式则默认升序排序 示例1 结果显…...

【UML用户指南】-21-对基本行为建模-活动图
目录 1、概念 2、组成结构 2.1、动作 2.2、活动节点 2.3、控制流 2.4、分支 2.5、分岔和汇合 2.6、泳道 2.7、对象流 2.8、扩展区域 3、一般用法 3.1、对工作流建模 3.2、对操作建模 一个活动图从本质上说是一个流程图,展现从活动到活动的控制流 活动图…...

【web2】jquary,bootstrap,vue
文章目录 1.jquary:选择器1.1 jquery框架引入:$("mydiv") 当成id选择器1.2 jquery版本/对象:$(js对象) -> jquery对象1.3 jquery的页面加载事件:$ 想象成 window.onload 1.4 jquery的基本选择器:$()里内容…...

独角兽品牌獭崎酱酒:高性价比的酱香之选
在酱香型白酒领域中,獭崎酱酒以其独特的品牌定位和高性价比迅速崛起,成为市场上备受关注的独角兽品牌。作为贵州茅台镇的一款新秀酱香酒,獭崎酱酒不仅传承了百年酿造工艺,还以创新的商业模式和亲民的价格赢得了广大消费者的青睐。…...

java打印菱形和空心菱形
java打印菱形 菱形分上下两个部分。其中上部分同打印金字塔;下部分循环部分i是递减 (ps:菱形层数只能为奇数) import java.util.Scanner;public class Lingxing{public static void main(String[] args) {Scanner myScanner new Scanner(S…...

Day10 —— 大数据技术之Scala
Scala编程入门 Scala的概述什么是Scala?Scala的重要特点Scala的使用场景 Scala的安装Scala基础Scala总结 Scala的概述 什么是Scala? Scala是一种将面向对象和函数式编程结合在一起的高级语言,旨在以简洁、优雅和类型安全的方式表达通用编程…...

Linux应用系统快速部署:docker快速部署linux应用程序
目录 一、背景 (一)引入docker的起因 (二)docker介绍 (三)Docker部署的优势 1、轻量级和可移植性 2、快速部署和扩展 3、一致性 4、版本控制 5、安全性 6、资源隔离 7、简化团队协作 8、多容器…...

三目运算符中间的表达式可以省略吗(a?:c)?
熟悉C语言的童靴对三目运算符都非常熟悉,a? b : c; 如果a为true,则整个运算符的值为b,否则为c;那么问题来了,三目运算符中间的表达式可以省略吗?即a? : c; 1、linux内核中出现的省略情况 本人在阅读内核代码是发现了下面的代码: preferr…...

android 彩虹进度条自定义view实现
实现一个彩虹色进度条功能,不说明具体用途大家应该能猜到。想找别人造的轮子,但是没有合适的,所以决定自己实现一个。 相关知识 android 自定义view LinearGradient 线性渐变 实现步骤 自定义view 自定义一个TmcView类继承View 重写两…...

免费一年SSL证书申请——建议收藏
免费一年SSL证书申请——建议收藏 获取免费一年期SSL证书其实挺简单的 准备你的网站: 确保你的网站已经有了域名,而且这个域名已经指向你的服务器。还要检查你的服务器支持HTTPS,也就是443端口要打开,这是HTTPS默认用的。 验证域…...

【docker1】指令,docker-compose,Dockerfile
文章目录 1.pull/image,run/ps(进程),exec/commit2.save/load:docker save 镜像id,不是容器id3.docker-compose:多容器:宿主机(eth0网卡)安装docker会生成一…...

Flutter中的异步和多进程
Flutter 是一个用于创建高性能、高保真度移动应用的框架,它使用 Dart 编程语言。 在 Flutter 中,异步和多进程是两种不同的概念,用于解决不同的问题。 异步 (Asynchronous) 异步编程是一种编程范式,允许代码在等待操作完成(如网络请求、文件 I/O)时继续执行其他任务,而不…...

学习C++第二天
1.缺省参数 缺省参数的概念: 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。 void show(int a 10) {cout << a << endl; }int main() {sho…...

解析Java中1000个常用类:AbstractSet类,你学会了吗?
推荐一个我自己写的小报童专栏导航网站: http://xbt100.top 收录了生财有术项目精选、AI海外赚钱、纯银的产品分析等专栏,陆续会收录更多的专栏,欢迎体验~复制URL可直达。 以下是正文。 在 Java 集合框架中,AbstractSet 是一个重要的抽象类,为实现自定义的集合(Set)提…...

Nginx基础概念和常用操作
文章目录 1. 安装、启动、连接2. 快速尝试部署网站3. 配置文件1. nginx.conf全局配置事件模块HTTP 模块性能优化建议 2. default.confserver 块基本设置日志设置根路径设置 4. 反向代理1. 模拟3个Web2. 链接 5. 负载均衡1. 加权轮询,Weighted Round Robin2. 最少连接…...

圈复杂度是什么?go语言调整圈复杂度举例
圈复杂度(也称为循环复杂度或McCabe复杂度)是衡量程序复杂性的一个指标,它通常与代码中的控制流结构(如条件语句、循环和函数调用)的数量相关。在Go语言中,你可以通过重构代码来降低圈复杂度,从…...

设计模式4-模版方法
设计模式 重构获得模式重构的关键技法1. 静态转动态2. 早绑定转晚绑定3. 继承转组合4. 编译时依赖转运行时依赖5. 紧耦合转松耦合 组件协助动机模式定义结构 要点总结。 例子示例解释: 重构获得模式 设计模式的目的是应对变化,提高复用 设计模式的要点…...

yii2 ActiveForm使用技巧
持续更新: 1、搜索输入框:form-inline <?php $form ActiveForm::begin([action > [index],method > get,options > [class > form-inline] (增加此行代码) ]); ?>...

【面试】基本数据类型的包装类缓存
目录 1. 说明2. Integer类分析2.1 代码块2.2 字节码2.3 分析2.4 valueOf方法 1. 说明 1.在java中,基本数据类型的包装类(Integer、Byte、Character、Short、Long、Boolean)的某些值会被缓存。2.以提高性能并减少内存使用。3.这种缓存机制是自…...

6月20日(周四)A股行情总结:A股险守3000点,恒生科技指数跌1.6%
A股三大股指走弱,科创板逆势上扬,半导体板块走强,多股20CM涨停。中芯国际港股涨超1%。恒生科技指数跌超1%。离岸人民币对美元汇率小幅走低,20日盘中最低跌至7.2874,创下2023年11月中旬以来的新低,随后收复部…...

Parallels Desktop 19 for mac破解版安装激活使用指南
Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机,并于其中装设不同的操作系统,如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时,您可在 …...

JExcel API使用笔记
JExcel API使用笔记 JExcel是一个开源的支持excel的java类库,广泛利用其api来生成excel报表 API基本使用 1.创建excel文件 workbook Workbook.createWorkbook(file);//传入file文件2.创建sheet页 WritableSheet sheet workbook.createSheet("记录表&quo…...

springCloudAlibaba之分布式网关组件---gateway
gateway-网关 网关spring cloud gatewaygateway初体验gateway整合nacos简写方式 内置路由断言工厂内置断言工厂 自定义路由断言工厂自定义路由工厂 内置/自定义过滤器典型内置过滤器自定义过滤器 全局过滤器自定义全局过滤器 请求日志记录&跨域处理Gateway跨域配置…...

Springboot项目jar加密
部署的程序进行加密,防止第三方非法拷贝走项目进行二次开发或部署。我们知道java代码编译后生成的以.class结尾的字节码文件或者.jar/.war结尾的可执行文件都是可以反编译生成.java文件的,虽然反编译后生成的.java文件和原本的.java文件有些微差别&#…...

【React】高阶组件
概述 高阶组件并非一个组件,而是增强组件功能的一个函数。 高阶组件的作用是对多个组件公共逻辑进行横向抽离。 高阶组件 – React (reactjs.org) 示例 ChildCom1.jsx import React from react;function ChildCom1(props) {return (<div>这是子组件1<d…...

全面理解-Flutter(万字长文,深度解析)
1、Web 性能差,跟原生 App 存在肉眼可见的差距; 2、React Native 跟 Web 相比,支持的能力非常有限,特定长场景问题,需要三端团队一个一个处理; 3、Web 浏览器的安卓碎片化严重(感谢 X5&#x…...

RabbitMQ实战宝典:从新手到专家的全面探索
前言 在当今分布式系统架构中,消息队列已成为不可或缺的一部分,而RabbitMQ作为其中的佼佼者,凭借其强大的功能和灵活性,广泛应用于各种规模的应用场景中。本文将带你从基础概念出发,深入探讨RabbitMQ的核心特性&#…...

6月21日(周五)AH股总结:沪指失守3000点,恒生科技指数跌近2%,多只沪深300ETF午后量能显著放大
内容提要 沪指全天围绕3000点关口来回拉锯,收盘跌破3000点。白酒及光刻机概念集体走低,中芯国际港股跌超2%。CRO医药概念及水利股逆势走强。 A股低开低走 沪指全天围绕3000点关口来回拉锯,收盘跌破3000点,跌0.24%。深成指跌0.04…...