diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 7e63d75a..9bf46c61 100755 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -609,7 +609,7 @@ function genBarGuide() { ] }, { - title: "开发环境(6)", + title: "开发环境(7)", collapsable: false, sidebarDepth: 0, children: [ @@ -619,6 +619,7 @@ function genBarGuide() { "github.md", "gitcode.md", "gitee.md", + "mac.md", ] }, { @@ -645,7 +646,7 @@ function genBarGuide() { ] }, { - title: "常用类库(5)", + title: "常用类库(6)", collapsable: true, sidebarDepth: 0, children: [ @@ -654,6 +655,7 @@ function genBarGuide() { "http.md", "ratelimiter.md", "spring-ai.md", + "disruptor.md", ] }, { @@ -2317,7 +2319,6 @@ function getBarBigMarket() { "api/第31节:分库分表数据同步ES.md", "api/第32节:ES-ORM多数据源配置使用.md", "api/第33节:xxl-job分布式任务调度.md", - "none.md", ] }, { @@ -2335,7 +2336,7 @@ function getBarBigMarket() { }, { title: "第5部分:后台管理", - collapsable: true, + collapsable: false, sidebarDepth: 0, children: [ "erp/第1节:初始后台运营页面.md", @@ -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", ] }, { diff --git a/docs/.vuepress/public/images/article/project/big-market/big-market-53-01.png b/docs/.vuepress/public/images/article/project/big-market/big-market-53-01.png new file mode 100644 index 00000000..2813a9db Binary files /dev/null and b/docs/.vuepress/public/images/article/project/big-market/big-market-53-01.png differ diff --git a/docs/.vuepress/public/images/article/project/big-market/big-market-53-02.png b/docs/.vuepress/public/images/article/project/big-market/big-market-53-02.png new file mode 100644 index 00000000..50edfa7e Binary files /dev/null and b/docs/.vuepress/public/images/article/project/big-market/big-market-53-02.png differ diff --git a/docs/.vuepress/public/images/article/project/big-market/big-market-53-03.png b/docs/.vuepress/public/images/article/project/big-market/big-market-53-03.png new file mode 100644 index 00000000..990a7db2 Binary files /dev/null and b/docs/.vuepress/public/images/article/project/big-market/big-market-53-03.png differ diff --git a/docs/.vuepress/public/images/article/project/big-market/big-market-53-04.png b/docs/.vuepress/public/images/article/project/big-market/big-market-53-04.png new file mode 100644 index 00000000..f196f8c2 Binary files /dev/null and b/docs/.vuepress/public/images/article/project/big-market/big-market-53-04.png differ diff --git a/docs/.vuepress/public/images/article/project/big-market/big-market-53-05.png b/docs/.vuepress/public/images/article/project/big-market/big-market-53-05.png new file mode 100644 index 00000000..176b1080 Binary files /dev/null and b/docs/.vuepress/public/images/article/project/big-market/big-market-53-05.png differ diff --git a/docs/.vuepress/public/images/article/project/big-market/big-market-53-06.png b/docs/.vuepress/public/images/article/project/big-market/big-market-53-06.png new file mode 100644 index 00000000..97a6512c Binary files /dev/null and b/docs/.vuepress/public/images/article/project/big-market/big-market-53-06.png differ diff --git a/docs/.vuepress/public/images/roadmap/tutorial/road-map-disruptor-01.gif b/docs/.vuepress/public/images/roadmap/tutorial/road-map-disruptor-01.gif new file mode 100644 index 00000000..f32099b9 Binary files /dev/null and b/docs/.vuepress/public/images/roadmap/tutorial/road-map-disruptor-01.gif differ diff --git a/docs/.vuepress/public/images/roadmap/tutorial/road-map-disruptor-02.png b/docs/.vuepress/public/images/roadmap/tutorial/road-map-disruptor-02.png new file mode 100644 index 00000000..a9bb17e0 Binary files /dev/null and b/docs/.vuepress/public/images/roadmap/tutorial/road-map-disruptor-02.png differ diff --git a/docs/.vuepress/public/images/roadmap/tutorial/road-map-disruptor-03.png b/docs/.vuepress/public/images/roadmap/tutorial/road-map-disruptor-03.png new file mode 100644 index 00000000..37014481 Binary files /dev/null and b/docs/.vuepress/public/images/roadmap/tutorial/road-map-disruptor-03.png differ diff --git a/docs/.vuepress/public/images/roadmap/tutorial/road-map-disruptor-04.png b/docs/.vuepress/public/images/roadmap/tutorial/road-map-disruptor-04.png new file mode 100644 index 00000000..10094eb5 Binary files /dev/null and b/docs/.vuepress/public/images/roadmap/tutorial/road-map-disruptor-04.png differ diff --git a/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-01.gif b/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-01.gif new file mode 100644 index 00000000..3e9103a8 Binary files /dev/null and b/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-01.gif differ diff --git a/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-02.gif b/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-02.gif new file mode 100644 index 00000000..66af144d Binary files /dev/null and b/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-02.gif differ diff --git a/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-03.png b/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-03.png new file mode 100644 index 00000000..03d37509 Binary files /dev/null and b/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-03.png differ diff --git a/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-04.png b/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-04.png new file mode 100644 index 00000000..23bfc1ce Binary files /dev/null and b/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-04.png differ diff --git a/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-05.png b/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-05.png new file mode 100644 index 00000000..26c3022a Binary files /dev/null and b/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-05.png differ diff --git a/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-06.png b/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-06.png new file mode 100644 index 00000000..43899720 Binary files /dev/null and b/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-06.png differ diff --git a/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-07.png b/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-07.png new file mode 100644 index 00000000..8caf650f Binary files /dev/null and b/docs/.vuepress/public/images/roadmap/tutorial/road-map-mac-07.png differ diff --git a/docs/md/project/big-market/big-market.md b/docs/md/project/big-market/big-market.md index c1acb795..1426052c 100644 --- a/docs/md/project/big-market/big-market.md +++ b/docs/md/project/big-market/big-market.md @@ -31,6 +31,8 @@ lock: no +**体验地址**:[https://openai.gaga.plus/](https://openai.gaga.plus/) - 左侧Bar,抽奖进入 + 这里抽奖模块通过RPC接口,对接到大营销平台。这里不只是抽奖,还要串联账户、奖品、返利等各项内容。接下来,小傅哥就着重介绍下这套信息项目的重点,让大家可以知道学习到哪些知识,掌握哪些技术。 >文末有加入学习方式,还有优惠券可以使用。先到先得! diff --git "a/docs/md/project/big-market/distributed/\347\254\2542\350\212\202\357\274\232\350\220\245\351\224\200\351\241\265\351\235\242\346\216\245\345\217\243\345\260\201\350\243\205.md" "b/docs/md/project/big-market/distributed/\347\254\2542\350\212\202\357\274\232\350\220\245\351\224\200\351\241\265\351\235\242\346\216\245\345\217\243\345\260\201\350\243\205.md" index ef6cfa99..788b35f4 100644 --- "a/docs/md/project/big-market/distributed/\347\254\2542\350\212\202\357\274\232\350\220\245\351\224\200\351\241\265\351\235\242\346\216\245\345\217\243\345\260\201\350\243\205.md" +++ "b/docs/md/project/big-market/distributed/\347\254\2542\350\212\202\357\274\232\350\220\245\351\224\200\351\241\265\351\235\242\346\216\245\345\217\243\345\260\201\350\243\205.md" @@ -1,6 +1,6 @@ --- title: 第2节:营销页面接口封装 -pay: https://t.zsxq.com/ByrMx +pay: https://t.zsxq.com/L2ZdQ --- # 《大营销平台系统设计实现》 - 外部对接 第2节:营销页面接口封装 @@ -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等,违反可追究进一步的法律行动。 diff --git "a/docs/md/project/big-market/distributed/\347\254\2544\350\212\202\357\274\232\346\264\273\345\212\250\344\270\212\346\236\266\345\217\221\345\270\203\351\242\204\347\203\255\345\257\271\346\216\245.md" "b/docs/md/project/big-market/distributed/\347\254\2544\350\212\202\357\274\232\346\264\273\345\212\250\344\270\212\346\236\266\345\217\221\345\270\203\351\242\204\347\203\255\345\257\271\346\216\245.md" new file mode 100644 index 00000000..93eaf13d --- /dev/null +++ "b/docs/md/project/big-market/distributed/\347\254\2544\350\212\202\357\274\232\346\264\273\345\212\250\344\270\212\346\236\266\345\217\221\345\270\203\351\242\204\347\203\255\345\257\271\346\216\245.md" @@ -0,0 +1,35 @@ +--- +title: 第4节:活动上架发布预热对接 +pay: https://t.zsxq.com/ByrMx +--- + +# 《大营销平台系统设计实现》 - 外部对接 第4节:活动上架发布预热对接 + +作者:小傅哥 +
博客:[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。 + +这就有点像你去一个大超市看到的,每个货架上摆放着各类的的商品,这些商品其实是有它的仓库的,但当前你所看到的买到的,都是货架上摆放的。所以为了让用户参与到我们的活动,我们也需要把活动进行上架。 + +## 二、业务流程 + +活动上架流程,涉及到三块,如图; + +
+ +
+ +- 首先,运营负责把活动上架,点击审核为`有效`。有效后,也就是在这个时间点把活动预热到 Redis,在咱们大营销中的预热操作是装配的接口,会在这个过程中调用。 +- 之后,用户从前端页面进入后,程序会查询到当前上架的活动,这样就明确了具体参与到哪个活动上了。 + diff --git a/docs/md/project/chatgpt/chatgpt.md b/docs/md/project/chatgpt/chatgpt.md index 82d9b66a..4597f78d 100644 --- a/docs/md/project/chatgpt/chatgpt.md +++ b/docs/md/project/chatgpt/chatgpt.md @@ -7,6 +7,7 @@ lock: no 作者:小傅哥
博客:[https://bugstack.cn](https://bugstack.cn) +
体验:[https://openai.gaga.plus](https://openai.gaga.plus) >沉淀、分享、成长,让自己和他人都能有所收获!😄 @@ -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) @@ -54,7 +55,7 @@ lock: no ## 三、`开发`的计划 -**死鬼**,5.1 假期即将来临,又到了疯狂的带着星球伙伴卷代码的时候。所以从 5.1 放假开始,小傅哥会逐步更新课程内容,粗略计划; +**死鬼**,又到了疯狂的带着星球伙伴卷代码的时候。 - OpenAI 接口服务 + Nginx SSL 配置 - OpenAI SDK diff --git a/docs/md/road-map/disruptor.md b/docs/md/road-map/disruptor.md new file mode 100644 index 00000000..73362e75 --- /dev/null +++ b/docs/md/road-map/disruptor.md @@ -0,0 +1,183 @@ +--- +title: Disruptor +lock: need +--- + +# Disruptor 高性能环形消息队列应用,Log4j 2 也用到了这套技术。 + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +说到底,无论是晋升述职还是面试考察,编程技能的展现总是在那些技术的横向对比和深度的了解运用。知其一,也知其二。一个场景的问题,往往也会对应着多种的解决方案,从没有绝对的好和不好,都是是否适合而已。所以,往往技术越好的,也越低调,不那么咋咋呼呼的。 + +
+ +
+ +**什么是柔性事务?** + +在分布式软件系统架构设计中,所有的并发资源的竞争,都会往`无锁化`、`非独占竞争`,以及`柔性事务`设计。柔性事务用于替代传统事务管理中(如ACID属性:原子性、一致性、隔离性、持久性),在分布式架构系统中的使用场景。通过消息、补偿,协调不同服务间的一致性。 + +
+ +
+ +那么在消息的使用中,除了有 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 事件消息的使用案例工程,你可以直接上手体现。 + +
+ +
+ +- app 是使用的启动层、trigger 是提供接口、监听消息、处理任务的触发器层。 +- 在这里我们通过 trigger 下的 event 包,监听事件消息。之后把这个 XxxEventHandler 让 app 层下的 Disruptor 进行实例化。 + +### 2. 引入POM + +```pom + + + com.lmax + disruptor + 3.4.4 + +``` + +- 引入 disruptor pom 包。 + +### 3. 监听消息 + +```java +@Slf4j +public class XxxEventHandler implements EventHandler { + + @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 disruptor() { + // 环形队列的大小,注意要是2的幂 + int bufferSize = 1024; + + // 创建Disruptor + Disruptor 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 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 | + +- 依据并发竞争的激烈程度的不同,Disruptor比ArrayBlockingQueue吞吐量快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) + +
+ +
+ +- **异步 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。) diff --git a/docs/md/road-map/mac.md b/docs/md/road-map/mac.md new file mode 100644 index 00000000..555c1398 --- /dev/null +++ b/docs/md/road-map/mac.md @@ -0,0 +1,102 @@ +--- +title: MacBook Pro +lock: need +--- + +# MacBook Pro - 关于我是不是该买Mac电脑? + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +不少程序员👨🏻‍💻伙伴,一到618、双11和开学季的时候,总会问买个 Windows 电脑,还是搞个 MacBook Pro?网上搜的很多对比,都是说同配置的苹果更贵,但心里总痒痒也好奇,MacBook Pro 是不更好用还能装个B! + +
+ +
+ +**如果你是程序员👨🏻‍💻,我更推荐苹果电脑。为啥?** + +首先,Windows 和 Mac 没有好坏之分,只不过 Windows 有 Windows 的使用场景、Mac 有 Mac 的应用领域。你喜欢打游戏、折腾些硬件对接、综合工作和娱乐,那 Windows 就是最强的选择。 + +但如果只在程序员这一行业对比编程写代码,一台笔记本,灵敏的触控板让你忘记鼠标的存在,苹果 IOS、IPad、Mac 全家桶式的多设备互通,可以做到极致的体验。 + +而更重要的是,Java 写好的代码是要放到 Linux 运行,而不是 Windows,所有你在所需的环境、所编写的脚本,可以无差别从 Mac 转移到 Linux 使用。这是 Windows 没法做到的,甚至 Windows 要在这块浪费掉你很多的时间。*不是不能用,就是不丝滑!* + +>接下来,小傅哥分享下 Mac 电脑的使用经验。新入坑伙伴可以参考。 + +## 一、我的经历 - 入坑 Mac! + +2019年,在这之前我只用过 Windows 电脑,包括;台式机、笔记本,还有自己DIY的台式机。Windows 给我感觉就是抗造,能自己折腾,加个内存,换个固态硬盘。打起来游戏方便,无论是澄海3c还是lol英雄联盟。 + +但在这之前,我也就只有一台 thinkstation 的台式机,每次长假期赔媳妇出门,我都想着要是有个笔记本电脑,我就可以在外面写代码。要不多没意思。所以,我的理由就有了! + +2019年,趁着618活动,搞了第一台 Mac 电脑 i5 8G 256G SSD。说实话这个配置一点也不高,而且价格也不便宜 `¥10189.00` 元。好在送一个 `Beats Solo3 Wireless`耳麦。 + +
+ +
+ +不过 `Beats Solo3 Wireless` 被我在咸鱼转手卖掉回血了。 + +
+ +
+**但谁能想得到,这台电脑在5个月以后,还能给我返回来 5000 元!** + +2019年,双11备战誓师大会。抽取幸运备战人员,清空购物车!最高清空额度,就是同年 618 期间消费的额度,上限 5000 元! + +
+ +
+ +这不巧了🐴,这不巧了🐴!618,我呀,我买了电脑,` ¥10189.00`!Duang、Duang、Duang,大转盘一转,还真抽中我了!那一刻,我决定做个抽奖系统! + +
+ +
+ +从此开启了苹果全家桶系列,苹果手机、IPad mini、IPad Pro ...,讲真,确实好用!那有人问,你 Mac 电脑,也打不了游戏呀?嗯,我媳妇给我买了PS5,还中了一台 Switch 😂 + +> 是的,后来我做了 Lottery 抽奖系统,还有大营销系统(Lottery Plus)! + +## 二、体验对比 - Mac 优势 + +这里我不谈那些打游戏、或者和一些硬件的适配。因为你有那些诉求,直接选择 Windows 就可以。比如;外星人也不错。 + +- 续航基本在10个小时左右,你是不需要带着充电电源的。像是在公司,双周需求评审,要占用一整个下午,这个期间电脑不需要插电源。 +- 不需要每天早上来开机,晚上回去关机。只要它不死机,甚至半年不都不关机。合上就走,打开就用。 +- 对于常用的技术编程环境类软件,直接下载就安装。因为这类软件是按照 Linux 系统做的,不是按照 Windows 系统做的。很多时候 Windows 要做兼容。比如执行脚本、安装 Docker,Windows 都要折腾一下。 +- 不需要安装各类杀毒软件,安装和卸载软件十分方便。有一些 Mac 的软件是付费的软件,但很多是一次付费终身使用,一点广告没有。不付费也可以破解使用,很多 Mac 软件都提供了破解版。 +- 尤其是 M2、M3 系列的 Mac,性能很炸裂,同时开几个 IDEA + 一堆环境类软件,以及一堆的打开的网页也很丝滑。 +- 切屏极其容易,多屏幕工作在 Mac 上是利器,可以不同的屏幕处理不同的事项。但在 Windows 切屏就挺费力气! +- Mac 电脑可以外接显示器,这个 Windows 也有。但 Mac 还可以和 IPad 联动,功能叫随行。 +- Mac 上复制的内容,或者苹果手机上复制内容,可以互相粘贴。也可以极其简单的方式互传文件。 +- Mac 电脑的触控板,一周内可习惯,习惯后不需要使用鼠标了。感受过 Mac 的触控板,会感觉鼠标是个鸡肋。间接的你不会有一个鼠标手「长时间用鼠标会做病」。 +- 和其他的软件设备,比如 nas 可以直接链接操作。你可以 Mac 电脑打开 idea,但代码放到 nas 上。这个很爽!并且 nas 可以直接给你提供 docker 环境。下一期可以介绍下 nas 的使用。 + +>其实,我认为还有一点是最重要的。做软件开发的,应该体验最好的软件逻辑。这可以让你的编程思维得到提升。虽然 Mac 比 Windows 贵,但折腾 Windows 浪费的时间也很贵。 + +## 三、装机分享 - 我的软件 + +Mac 电脑的软件非常好安装,双击打卡,之后交给它! + +
+ +
+ +安装软件资源库; + +- 推荐:[https://aerolite.dev/applite](https://aerolite.dev/applite) +- 其他:[https://macwk.cn/](https://macwk.cn/) +- 其他:[https://macapp.org.cn/](https://macapp.org.cn/) + +## 四、避坑经验 - 别浪费钱 + +- 钱少,但想体现Mac,可以考虑 Mac mini,教育版。尽量在16G起。这样价格和一台 Windows 笔记本差不多。 +- 做编程开发,别买二手的Mac。这些软件都是不断的升级的,太老的 Mac 一般都很卡,升级 Mac 系统,就跟升级 苹果手机 IOS 一样,越升级越卡。 +- 推荐买上一年的版本,价格合适。版本也不旧。但别买太低配置或者年限太老的。其实我们天天用的东西,价格高点也合适。 +- Mac 的 M4 也快出了。我下一个会考虑等下 M4。 \ No newline at end of file