Skip to content

Commit

Permalink
feat:内容更新
Browse files Browse the repository at this point in the history
  • Loading branch information
fuzhengwei committed Oct 31, 2024
1 parent 9f19321 commit fee7cf2
Show file tree
Hide file tree
Showing 24 changed files with 335 additions and 10 deletions.
12 changes: 7 additions & 5 deletions docs/.vuepress/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -609,7 +609,7 @@ function genBarGuide() {
]
},
{
title: "开发环境(6)",
title: "开发环境(7)",
collapsable: false,
sidebarDepth: 0,
children: [
Expand All @@ -619,6 +619,7 @@ function genBarGuide() {
"github.md",
"gitcode.md",
"gitee.md",
"mac.md",
]
},
{
Expand All @@ -645,7 +646,7 @@ function genBarGuide() {
]
},
{
title: "常用类库(5)",
title: "常用类库(6)",
collapsable: true,
sidebarDepth: 0,
children: [
Expand All @@ -654,6 +655,7 @@ function genBarGuide() {
"http.md",
"ratelimiter.md",
"spring-ai.md",
"disruptor.md",
]
},
{
Expand Down Expand Up @@ -2317,7 +2319,6 @@ function getBarBigMarket() {
"api/第31节:分库分表数据同步ES.md",
"api/第32节:ES-ORM多数据源配置使用.md",
"api/第33节:xxl-job分布式任务调度.md",
"none.md",
]
},
{
Expand All @@ -2335,7 +2336,7 @@ function getBarBigMarket() {
},
{
title: "第5部分:后台管理",
collapsable: true,
collapsable: false,
sidebarDepth: 0,
children: [
"erp/第1节:初始后台运营页面.md",
Expand All @@ -2344,12 +2345,13 @@ function getBarBigMarket() {
},
{
title: "第6部分:外部对接",
collapsable: true,
collapsable: false,
sidebarDepth: 0,
children: [
"distributed/第1节:对接OpenAI项目额度奖品接口.md",
"distributed/第2节:营销页面接口封装.md",
"distributed/第3节:RPC接口对接支付返利.md",
"distributed/第4节:活动上架发布预热对接.md",
]
},
{
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions docs/md/project/big-market/big-market.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ lock: no
<img src="https://bugstack.cn/images/article/project/big-market/big-market-01-02.png" width="750px">
</div>

**体验地址**[https://openai.gaga.plus/](https://openai.gaga.plus/) - 左侧Bar,抽奖进入

这里抽奖模块通过RPC接口,对接到大营销平台。这里不只是抽奖,还要串联账户、奖品、返利等各项内容。接下来,小傅哥就着重介绍下这套信息项目的重点,让大家可以知道学习到哪些知识,掌握哪些技术。

>文末有加入学习方式,还有优惠券可以使用。先到先得!
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: 第2节:营销页面接口封装
pay: https://t.zsxq.com/ByrMx
pay: https://t.zsxq.com/L2ZdQ
---

# 《大营销平台系统设计实现》 - 外部对接 第2节:营销页面接口封装
Expand All @@ -12,7 +12,7 @@ pay: https://t.zsxq.com/ByrMx
- **本章难度**:★★★☆☆
- **本章重点**:在 big-market 工程,开发适配 openai 项目,前端工程 chatgpt-web 所需的 http 接口。进行页面的开发和接口对接。
- **课程视频**[https://t.zsxq.com/15gLHtPaU](https://t.zsxq.com/15gLHtPaU)
- **课程视频**[https://t.zsxq.com/A7eoq](https://t.zsxq.com/A7eoq)

**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
title: 第4节:活动上架发布预热对接
pay: https://t.zsxq.com/ByrMx
---

# 《大营销平台系统设计实现》 - 外部对接 第4节:活动上架发布预热对接

作者:小傅哥
<br/>博客:[https://bugstack.cn](https://bugstack.cn)

>沉淀、分享、成长,让自己和他人都能有所收获!😄
- **本章难度**:★★★☆☆
- **本章重点**:增加活动上架服务,通过运营后台管理上架,前端工程根据渠道sc值查询上架活动。
- **课程视频**[https://t.zsxq.com/15gLHtPaU](https://t.zsxq.com/15gLHtPaU)

**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。

## 一、本章诉求

本节的内容是一个互联网中对外发布抽奖、发券、拉新等行为活动设计的通用方案。在实际运营作业中,会创建出很多的活动,这些活动会被分配到不同渠道给不同来源进行使用。那么这里就要有一个活动上架平台,让外部调用方根据传入的SC值,也就是渠道和来源调用到这一方可以使用的当前的活动ID。

这就有点像你去一个大超市看到的,每个货架上摆放着各类的的商品,这些商品其实是有它的仓库的,但当前你所看到的买到的,都是货架上摆放的。所以为了让用户参与到我们的活动,我们也需要把活动进行上架。

## 二、业务流程

活动上架流程,涉及到三块,如图;

<div align="center">
<img src="https://bugstack.cn/images/article/project/big-market/big-market-53-01.png" width="550px">
</div>

- 首先,运营负责把活动上架,点击审核为`有效`。有效后,也就是在这个时间点把活动预热到 Redis,在咱们大营销中的预热操作是装配的接口,会在这个过程中调用。
- 之后,用户从前端页面进入后,程序会查询到当前上架的活动,这样就明确了具体参与到哪个活动上了。

7 changes: 4 additions & 3 deletions docs/md/project/chatgpt/chatgpt.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ lock: no

作者:小傅哥
<br/>博客:[https://bugstack.cn](https://bugstack.cn)
<br/>体验:[https://openai.gaga.plus](https://openai.gaga.plus)

>沉淀、分享、成长,让自己和他人都能有所收获!😄
Expand All @@ -24,9 +25,9 @@ lock: no

作为一个纯搞技术的号主,我更希望做符合技术人员长期发展的学习事项。如 ChatGPT、文心一言、通义千问、AIGC、Civita,这样的东西会越来越多,而作为研发更应该注重以`生成式服务`所搭建出一套体系化应用微服务。所以小傅哥的星球又要带着大家搞新项目了 **《ChatGPT 微服务应用体系构建》** - 说到又,那小傅哥的星球搞了多少项目🤔?

除技术小册外,星球历经项目5个:- `加入小傅哥的知识星球,相当于付费1个项目的价格,就可以学习所有过往的项目!`
除技术小册外,星球所有项目都可以学习:- `加入小傅哥的知识星球,相当于付费1个项目的价格,就可以学习所有过往的项目!`

- 《ChatGPT 微服务应用体系构建 - API-SDK、鉴权、公众号对接、微信对接、交易支付》- **5.1日启动** 🌲
- 《ChatGPT 微服务应用体系构建 - API-SDK、鉴权、公众号对接、微信对接、交易支付》
- [《ChatGPT AI 问答助手》](https://bugstack.cn/md/project/chatbot-api/chatbot-api.html)
- [《API网关 - 中间件设计和实践》](https://bugstack.cn/md/assembly/api-gateway/api-gateway.html)
- [《SpringBoot 中间件设计和开发》](https://bugstack.cn/md/assembly/middleware/2019-12-02-SpringBoot%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86%E4%B8%AD%E9%97%B4%E4%BB%B6%E4%B9%8B%E7%BB%9F%E4%B8%80%E7%99%BD%E5%90%8D%E5%8D%95%E9%AA%8C%E8%AF%81.html)
Expand Down Expand Up @@ -54,7 +55,7 @@ lock: no

## 三、`开发`的计划

**死鬼**5.1 假期即将来临,又到了疯狂的带着星球伙伴卷代码的时候。所以从 5.1 放假开始,小傅哥会逐步更新课程内容,粗略计划;
**死鬼**,又到了疯狂的带着星球伙伴卷代码的时候。

- OpenAI 接口服务 + Nginx SSL 配置
- OpenAI SDK
Expand Down
183 changes: 183 additions & 0 deletions docs/md/road-map/disruptor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
---
title: Disruptor
lock: need
---

# Disruptor 高性能环形消息队列应用,Log4j 2 也用到了这套技术。

作者:小傅哥
<br/>博客:[https://bugstack.cn](https://bugstack.cn)

> 沉淀、分享、成长,让自己和他人都能有所收获!😄
大家好,我是技术UP主小傅哥。

说到底,无论是晋升述职还是面试考察,编程技能的展现总是在那些技术的横向对比和深度的了解运用。知其一,也知其二。一个场景的问题,往往也会对应着多种的解决方案,从没有绝对的好和不好,都是是否适合而已。所以,往往技术越好的,也越低调,不那么咋咋呼呼的。

<div align="center">
<img src="https://bugstack.cn/images/roadmap/tutorial/road-map-disruptor-01.gif" width="200px"/>
</div>

**什么是柔性事务?**

在分布式软件系统架构设计中,所有的并发资源的竞争,都会往`无锁化``非独占竞争`,以及`柔性事务`设计。柔性事务用于替代传统事务管理中(如ACID属性:原子性、一致性、隔离性、持久性),在分布式架构系统中的使用场景。通过消息、补偿,协调不同服务间的一致性。

<div align="center">
<img src="https://bugstack.cn/images/roadmap/tutorial/road-map-disruptor-02.png" width="550px"/>
</div>

那么在消息的使用中,除了有 MQ 消息,使用于微服务之间。还有本地消息,可以作用在各个领域间驱动流程。关于本地消息可以用,Spring 的监听、Redis 发布订阅、Guava EventBus 事件总线,这些内容在小傅哥博客 [bugstack.cn](https://bugstack.cn) 《路书》中有相关的案例。之后本节咱们介绍一个新的高性能组件 Disruptor 的使用。

## 一、关于 Disruptor

Disruptor 是一种高性能的并发框架,最初由 LMAX 开发,用于解决高吞吐量、低延迟的消息处理问题。它提供了一种无锁的、有序的事件处理模型,非常适合处理需要高性能的场景。Disruptor 本身并不是用于实现事务的框架,而是一个事件处理器。因此,要在 Disruptor 上实现柔性事务,需要结合其事件处理能力与柔性事务的模式。

- 源码:[https://github.com/LMAX-Exchange/disruptor](https://github.com/LMAX-Exchange/disruptor)
- 文档:[https://lmax-exchange.github.io/disruptor/](https://lmax-exchange.github.io/disruptor/) - 谷歌浏览器右键点翻译为中文。

## 二、实战案例

### 1. 工程结构

小傅哥准备好了一份基于 Disruptor 事件消息的使用案例工程,你可以直接上手体现。

<div align="center">
<img src="https://bugstack.cn/images/roadmap/tutorial/road-map-disruptor-03.png" width="400px"/>
</div>

- app 是使用的启动层、trigger 是提供接口、监听消息、处理任务的触发器层。
- 在这里我们通过 trigger 下的 event 包,监听事件消息。之后把这个 XxxEventHandler 让 app 层下的 Disruptor 进行实例化。

### 2. 引入POM

```pom
<!-- https://mvnrepository.com/artifact/com.lmax/disruptor -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.4</version>
</dependency>
```

- 引入 disruptor pom 包。

### 3. 监听消息

```java
@Slf4j
public class XxxEventHandler implements EventHandler<XxxEventHandler.Message> {

@Override
public void onEvent(Message longEvent, long l, boolean b) throws Exception {
log.info("接收消息:{}", longEvent.getValue());
}

@Data
public static class Message {
private String value;
}

}
```

- 在 trigger 下 event 包内,加一个实现了 disruptor EventHandler 的监听实现类,消息体类型我们定义到 XxxEventHandler 中,也就是 Message。具体生产使用的时候,按需调整。
- 这个接收消息的过程和使用 MQ 的方式是一样的。

### 4. 实例化监听

```java
@Configuration
public class DisruptorConfig {

private final ExecutorService executor = Executors.newCachedThreadPool();

@Bean("xxxEventDisruptor")
public Disruptor<XxxEventHandler.Message> disruptor() {
// 环形队列的大小,注意要是2的幂
int bufferSize = 1024;

// 创建Disruptor
Disruptor<XxxEventHandler.Message> disruptor = new Disruptor<>(XxxEventHandler.Message::new, bufferSize, executor);

// 连接事件处理器
disruptor.handleEventsWith(new XxxEventHandler());

// 开始Disruptor
disruptor.start();

return disruptor;
}

}
```

-App 模块下,有一个 config 专门的配置类,在这里配置下消息监听。这个过程和我们之前使用的 Redis 发布订阅是一样的。

### 5. 推送消息(Test)

```java
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class DisruptorTest {

@Resource
private Disruptor<XxxEventHandler.Message> xxxEventDisruptor;

@Test
public void test_publishEvent() throws InterruptedException {

for (int i = 0; i < 10; i++) {
xxxEventDisruptor.publishEvent((event, sequence) -> event.setValue("你好,我是 Disruptor Message"));
}

// 暂停 - 测试完手动关闭程序
new CountDownLatch(1).await();
}

}
```

```java
24-10-26.11:55:55.827 [main ] INFO DisruptorTest - Starting DisruptorTest using Java 1.8.0_311 on MacBook-Pro.local with PID 92827 (started by fuzhengwei in /Users/fuzhengwei/1024/KnowledgePlanet/road-map/xfg-dev-tech-disruptor/xfg-dev-tech-app)
24-10-26.11:55:55.829 [main ] INFO DisruptorTest - The following 1 profile is active: "dev"
24-10-26.11:55:57.749 [main ] INFO DisruptorTest - Started DisruptorTest in 2.526 seconds (JVM running for 3.741)
24-10-26.11:55:58.125 [pool-2-thread-1 ] INFO XxxEventHandler - 接收消息:你好,我是 Disruptor Message
24-10-26.11:55:58.128 [pool-2-thread-1 ] INFO XxxEventHandler - 接收消息:你好,我是 Disruptor Message
24-10-26.11:55:58.128 [pool-2-thread-1 ] INFO XxxEventHandler - 接收消息:你好,我是 Disruptor Message
24-10-26.11:55:58.128 [pool-2-thread-1 ] INFO XxxEventHandler - 接收消息:你好,我是 Disruptor Message
24-10-26.11:55:58.128 [pool-2-thread-1 ] INFO XxxEventHandler - 接收消息:你好,我是 Disruptor Message
24-10-26.11:55:58.128 [pool-2-thread-1 ] INFO XxxEventHandler - 接收消息:你好,我是 Disruptor Message
24-10-26.11:55:58.128 [pool-2-thread-1 ] INFO XxxEventHandler - 接收消息:你好,我是 Disruptor Message
24-10-26.11:55:58.128 [pool-2-thread-1 ] INFO XxxEventHandler - 接收消息:你好,我是 Disruptor Message
24-10-26.11:55:58.128 [pool-2-thread-1 ] INFO XxxEventHandler - 接收消息:你好,我是 Disruptor Message
24-10-26.11:55:58.128 [pool-2-thread-1 ] INFO XxxEventHandler - 接收消息:你好,我是 Disruptor Message
```

- 提供一个单测来测试消息推送,这样你就可以监听到消息了。

## 三、总结

在美团、京东、阿里,等各个大厂中都有很多这样的组件使用,在美团发布过的文章中[《高性能队列——Disruptor》](https://tech.meituan.com/2016/11/18/disruptor.html) 还有一个对应的压测数据。CPU:Intel Core i7-2720QM,JVM:Java 1.6.0_25 64-bit,OS:Ubuntu 11.04

| - | ABQ | Disruptor |
| :----------------- | :-------- | :--------- |
| Unicast: 1P – 1C | 4,057,453 | 22,381,378 |
| Pipeline: 1P – 3C | 2,006,903 | 15,857,913 |
| Sequencer: 3P – 1C | 2,056,118 | 14,540,519 |
| Multicast: 1P – 3C | 260,733 | 10,860,121 |
| Diamond: 1P – 3C | 2,082,725 | 15,295,197 |

- 依据并发竞争的激烈程度的不同,DisruptorArrayBlockingQueue吞吐量快4~7倍。

---

另外,Log4j 2 采用了 Disruptor(一种无锁的线程间通信库),提高吞吐量降低延迟。在生产使用中,大并发的系统注意 Log4j 版本。官网说明:[https://logging.apache.org/log4j/2.12.x/manual/async.html](https://logging.apache.org/log4j/2.12.x/manual/async.html)

<div align="center">
<img src="https://bugstack.cn/images/roadmap/tutorial/road-map-disruptor-04.png" width="850px"/>
</div>

- **异步 Logger**Log4j 2 中的新增功能。其目的是尽快从对 Logger.log 的调用返回到应用程序。您可以选择使所有 Logger 异步,或使用同步和异步 Logger 的混合。使所有 Logger 异步将提供最佳性能,而混合使用则可为您提供更大的灵活性。
- **LMAX Disruptor 技术**。异步记录器内部使用 [Disruptor(](https://logging.apache.org/log4j/2.12.x/manual/async.html#UnderTheHood)一种无锁的线程间通信库)而不是队列,从而实现更高的吞吐量和更低的延迟。
- 作为异步日志记录器工作的一部分,**异步附加器**已得到增强,可以在批处理结束时(当队列为空时)刷新到磁盘。这会产生与配置“immediateFlush=true”相同的结果,即所有收到的日志事件始终在磁盘上可用,但效率更高,因为它不需要在每个日志事件上都接触磁盘。(异步附加器在内部使用 ArrayBlockingQueue,不需要类路径上的 Disruptor jar。)
Loading

0 comments on commit fee7cf2

Please sign in to comment.