├── .gitignore
├── .idea
├── Java-Interview-Tutorial.iml
└── codeStyles
│ └── codeStyleConfig.xml
├── .vscode
├── .server-controller-port.log
└── settings.json
├── LICENSE
├── README.md
├── build.sh
├── docs
├── .DS_Store
├── .vuepress
│ ├── components
│ │ ├── HideArticle.vue
│ │ ├── LockArticle.vue
│ │ ├── PayArticle.vue
│ │ └── RoadMap.vue
│ ├── config.js
│ ├── enhanceApp.js
│ ├── public
│ │ ├── CNAME
│ │ ├── LICENSE
│ │ ├── bcloud_nginx_user.conf
│ │ ├── favicon.ico
│ │ ├── images
│ │ │ ├── 12306
│ │ │ │ └── 12306项目文档.png
│ │ │ ├── personal
│ │ │ │ ├── javaedge.png
│ │ │ │ ├── qrcode.png
│ │ │ │ └── xingqiu.png
│ │ │ └── system
│ │ │ │ ├── banner.jpg
│ │ │ │ ├── blog-02.png
│ │ │ │ ├── download-2.png
│ │ │ │ ├── logo.jpg
│ │ │ │ ├── toc.png
│ │ │ │ ├── toggle.png
│ │ │ │ ├── wexin4.png
│ │ │ │ ├── xingqiu.png
│ │ │ │ └── 合作单位-04.svg
│ │ ├── js
│ │ │ ├── btwplugin.js
│ │ │ ├── fingerprint2.min.js
│ │ │ ├── global.js
│ │ │ └── jquery.min.js
│ │ └── robots.txt
│ ├── styles
│ │ ├── index.styl
│ │ └── palette.styl
│ └── theme
│ │ ├── components
│ │ ├── AlgoliaSearchBox.vue
│ │ ├── DropdownLink.vue
│ │ ├── DropdownTransition.vue
│ │ ├── FullScreenBtn.vue
│ │ ├── Home.vue
│ │ ├── NavLinks.vue
│ │ ├── Navbar.vue
│ │ ├── Page.vue
│ │ ├── PageSidebar.vue
│ │ ├── PageSidebarBackToTop.vue
│ │ ├── PageSidebarToc.vue
│ │ ├── PageSidebarTocLink.vue
│ │ └── SiteMap.vue
│ │ ├── index.js
│ │ ├── layouts
│ │ └── Layout.vue
│ │ ├── styles
│ │ └── wrapper.styl
│ │ └── util
│ │ └── index.js
├── README.md
└── md
│ ├── 12306
│ ├── 12306-basic-info.md
│ ├── 12306架构设计难点.md
│ ├── Builder模式在项目设计中的应用.md
│ ├── ES深分页问题解决方案.md
│ ├── MySQL深分页调优实战.md
│ ├── Redis缓存雪崩、缓存穿透、缓存击穿解决方案详解.md
│ ├── SpringBoot统一异常处理流程.md
│ ├── redis-cache-expiry-strategy.md
│ ├── redisson分布式锁使用.md
│ ├── 使用JUC中的核心组件来优化业务功能性能.md
│ ├── 分布式锁在项目设计中的应用.md
│ ├── 单例+简单工厂模式在项目设计中的应用.md
│ ├── 如何处理消息丢失问题?.md
│ ├── 如何生成分布式ID.md
│ ├── 死磕设计模式之抽象策略模式.md
│ ├── 死磕设计模式之抽象责任链模式.md
│ ├── 环境搭建.md
│ ├── 策略模式在项目设计中的应用.md
│ ├── 详解雪花算法.md
│ ├── 责任链模式重构复杂业务场景.md
│ └── 选择合适的缓存过期策略.md
│ ├── .DS_Store
│ ├── AI
│ ├── 00-introduce-to-LangGraph.md
│ ├── 00-introduction-to-langchain.md
│ ├── 00-为什么要学习大模型.md
│ ├── 01-RAG应用框架和解析器.md
│ ├── 01-langchain-hello-world-project.md
│ ├── 01-three-minute-fastapi-ai-agent-setup.md
│ ├── 01-what-are-agents.md
│ ├── 01-大语言模型发展.md
│ ├── 02-Agent应用对话情感优化.md
│ ├── 02-LangChain实战:用prompts模板调教LLM的输入出.md
│ ├── 02-domestic-and-international-llm-multi-model-strong-applications.md
│ ├── 02-how-langchain-agents-are-implemented.md
│ ├── 02-相似性检索的关键 - Embedding.md
│ ├── 03-core-of-rag-result-retrieval-and-reordering.md
│ ├── 03-large-language-model-flaws.md
│ ├── 03-use-tts-to-make-your-ai-agent-speak.md
│ ├── 03-what-is-zero-shot-one-shot-few-shot-learning.md
│ ├── 03-示例选择器.md
│ ├── 04-LLMs和Chat Models.md
│ ├── 04-ai-ecosystem-industry-analysis.md
│ ├── 04-how-to-add-memory-in-langchain-agents.md
│ ├── 04-prompt-helping-llm-understand-knowledge.md
│ ├── 05-Loader机制.md
│ ├── 05-ai-era-turning-point-for-app-developers.md
│ ├── 05-how-to-enable-memory-sharing-between-agent-and-tool.md
│ ├── 06-how-to-use-langchain-built-in-tools.md
│ ├── 06-文档转换实战.md
│ ├── 06-智能体项目案例.md
│ ├── 07-lcel-langchain-expression-language.md
│ ├── 08-ali-tongyi-qianwen-openai-compatible-solution.md
│ ├── 09-lcel-chain-and-prompt-implementation.md
│ ├── 10-ali-tongyi-qianwen-status-codes-explanation.md
│ ├── 11-lcel-memory-addition-method.md
│ ├── 12-lcel-agent-core-components.md
│ ├── 13-best-development-practices.md
│ ├── 2025-future-rag-trends-four-technologies.md
│ ├── AI Agent应用出路到底在哪?.md
│ ├── AI大模型企业应用实战.md
│ ├── Complex-SQL-Joins-with-LangGraph-and-Waii.md
│ ├── a2a
│ │ └── a2a-a-new-era-of-agent-interoperability.md
│ ├── agent
│ │ ├── Build-App-with-Dify.md
│ │ ├── Junie.md
│ │ ├── ai-agents-dont-security-nightmare.md
│ │ ├── boost-ai-workflow-resilience-with-error-handling.md
│ │ ├── changelog-cursor.md
│ │ ├── configuring-models-in-dify.md
│ │ ├── dify-agent-and-zapier-mcp-unlock-ai-automation.md
│ │ ├── dify-deep-research-workflow-farewell-to-fragmented-search-unlock-ai-driven-insights.md
│ │ ├── dify-v1-0-building-a-vibrant-plugin-ecosystem.md
│ │ ├── dify-v1-1-0-filtering-knowledge-retrieval-with-customized-metadata.md
│ │ ├── goodbye-cursor-hello-windsurf.md
│ │ ├── improve-quality-gen-ai.md
│ │ ├── introducing-codex.md
│ │ ├── perplexity-labs.md
│ │ ├── what-is-llmops.md
│ │ └── windsurf-update.md
│ ├── ai-agent-is-coming.md
│ ├── ai-trends-disrupting-software-teams.md
│ ├── aigc-app-in-e-commerce-review.md
│ ├── amazon-strands-agents-sdk.md
│ ├── building-effective-agents.md
│ ├── customizing-a-tool-for-your-ai-agent.md
│ ├── document-parsing-and-chunking-in-open-source-tools.md
│ ├── effective-datasets-fine-tuning.md
│ ├── langchain4j
│ │ ├── 01-intro.md
│ │ ├── 04-0-最新发布功能.md
│ │ ├── 04-1-最新发布功能.md
│ │ ├── 04-2-最新发布功能.md
│ │ ├── 04-3-最新发布功能.md
│ │ ├── ai-services.md
│ │ ├── chat-and-language-models.md
│ │ ├── chat-memory.md
│ │ ├── customizable-http-client.md
│ │ ├── get-started.md
│ │ ├── mcp.md
│ │ ├── observability.md
│ │ ├── rag.md
│ │ ├── response-streaming.md
│ │ ├── spring-boot-integration.md
│ │ ├── structured-outputs.md
│ │ └── tools.md
│ ├── langgraph-studio.md
│ ├── langserve-revolutionizes-llm-app-deployment.md
│ ├── llm
│ │ ├── ChatGPT为啥不用Websocket而是EventSource.md
│ │ ├── Claude3到底多强.md
│ │ ├── GPTs.md
│ │ ├── accelerating-workflow-processing-with-parallel-branch.md
│ │ ├── chatgpt-canva.md
│ │ ├── claude-3-7-sonnet.md
│ │ ├── claude-4.md
│ │ ├── contextual-retrieval.md
│ │ ├── cuda.md
│ │ ├── deepseek-r1-detail.md
│ │ ├── enhancing-llm-memory-with-conversation-variables-and-variable-assigners.md
│ │ ├── gpullama3-java-gpu-llm.md
│ │ ├── inference-engine.md
│ │ ├── integrate-dify-and-aws-services-to-enable-more-flexible-translation-workflows.md
│ │ ├── introducing-parent-child-retrieval-for-enhanced-knowledge.md
│ │ ├── llama-4-multimodal-intelligence.md
│ │ ├── llm-api-platform.md
│ │ ├── llm-knowledge-base-segmentation-data-cleaning.md
│ │ ├── llm-reasoning-limitations.md
│ │ ├── lm-studio-transform-mac-into-ai-tool.md
│ │ ├── lmstudio-local-llm-call.md
│ │ ├── making-an-llm-that-sees-and-reasons.md
│ │ ├── memory-faq.md
│ │ ├── navigating-llm-deployment-tips-tricks-and-techniques.md
│ │ ├── only-ai-flow-can-do.md
│ │ ├── qwen-QwQ.md
│ │ ├── qwen3-embedding.md
│ │ ├── qwen3.md
│ │ ├── 中国大陆用户如何使用Jetbrains内置的AI插件AI Assistant.md
│ │ ├── 携手阿里云:JetBrains AI Assistant 正式发布!.md
│ │ └── 计算机使用功能.md
│ ├── local-large-model-deployment.md
│ ├── mcp
│ │ ├── mcp-and-the-future-of-ai-tooling.md
│ │ ├── mcp-fad-or-fixture.md
│ │ ├── mcp-java-sdk.md
│ │ └── resources.md
│ ├── methods-adapting-large-language-models.md
│ ├── ml
│ │ ├── 01-人工智能概要.md
│ │ ├── 02-MR 算法分类.md
│ │ ├── 05-开发环境安装.md
│ │ ├── MapReduce分治思想.md
│ │ ├── basic-of-nlp.md
│ │ ├── building-neural-networks-with-pytorch.md
│ │ ├── gated-recurrent-unit-model.md
│ │ ├── key-path-from-feature-enhancement-to-dimensional-norm.md
│ │ ├── long-short-term-memory.md
│ │ ├── mask-tensor.md
│ │ ├── neural-memory-engine-for-sequence-modeling.md
│ │ ├── pytorch-cifar10-image-classifier-tutorial.md
│ │ ├── text-data-analysis-practical-guide.md
│ │ ├── text-data-augmentation-back-translation-guide.md
│ │ ├── text-preprocessing-overview.md
│ │ ├── text-vectorization-guide.md
│ │ ├── what-is-neural-network.md
│ │ ├── what-is-rnn.md
│ │ ├── what-is-tensor.md
│ │ ├── 一文看懂AI的Transformer架构.md
│ │ └── 软件工程师转型AI的全攻略.md
│ ├── multi_agent.md
│ ├── overcoming-fear-uncertainty-and-doubt-in-the-era-of-ai-transformation.md
│ ├── prompt
│ │ ├── 01-Prompt网站.md
│ │ └── 02-常用Prompt.md
│ ├── rag-introduction-tool-to-eliminate-llm-hallucinations.md
│ ├── software-development-in-AI2.md
│ ├── spring-ai-alibaba
│ │ └── why-choose-spring-ai-alibaba-for-smart-customer-service.md
│ └── to-fine-tune-or-not-to-fine-tune-llm.md
│ ├── DDD
│ ├── 00-DDD专栏规划.md
│ ├── 02-领域驱动设计DDD在B端营销系统的实践.md
│ ├── 04-DDD设计流程,以业务案例解读.md
│ ├── 09-DDD在大厂交易系统演进的应用.md
│ ├── 11-上下文映射.md
│ ├── 13-DDD分层架构及代码目录结构.md
│ ├── 23-理解领域事件(Domain Event).md
│ ├── decouple-event-retrieval-from-processing.md
│ ├── domain-service.md
│ ├── event-versioning.md
│ ├── integrating-event-driven-microservices-with-request-response-APIs.md
│ ├── rate-limit-event-processing.md
│ ├── use-circuit-breaker-to-pause-event-retrieval.md
│ └── 基于电商履约场景的DDD实战.md
│ ├── Dubbo
│ ├── 01-互联网架构的发展历程.md
│ ├── 02-Dubbo特性及工作原理.md
│ ├── 03-Dubbo的负载均衡及高性能RPC调用.md
│ ├── 04-Dubbo的通信协议.md
│ ├── 05-Dubbo的应用及注册和SPI机制.md
│ ├── 06-Dubbo相关面试题和源码使用技巧.md
│ └── 07-Dubbo真实生产环境思考.md
│ ├── MQTT
│ ├── avoid-bare-parsefrom-mqtt-protobuf-consumption.md
│ ├── mqtt-kafka-iot-message-streaming-integration.md
│ └── mqtt-publish-subscribe-intro.md
│ ├── RocketMQ
│ ├── 01-RocketMQ核心内容.md
│ ├── 01-基本概念.md
│ ├── 02-下载安装.md
│ ├── 02-基于电商场景的高并发RocketMQ实战.md
│ ├── 03-消息的有序性.md
│ ├── 04 - 订阅机制.md
│ ├── 05 - 批量消息和事务消息.md
│ ├── RocketMQ 5.x任意时间延时消息原理.md
│ ├── RocketMQ各版本新特性.md
│ ├── RocketMQ在基金大厂的分布式事务实践.md
│ ├── RocketMQ如何实现事务?.md
│ ├── RocketMQ的延时消息.md
│ ├── message-queues-more-than-app-communication.md
│ ├── 核心概念.md
│ ├── 消息恰好被消费一次.md
│ ├── 消息队列的事务消息.md
│ ├── 消息队列面试必问解析.md
│ └── 避免无法克服的队列积压.md
│ ├── ShardingSphere
│ ├── 10-顶级企业如何用数据脱敏保护用户隐私!.md
│ ├── 11-动态配置管理背后的编排治理真相!.md
│ ├── 14-ShardingSphere的分布式主键实现.md
│ ├── 19-路由引擎:如何在路由过程中集成多种路由策略和路由算法?.md
│ ├── ShardingSphere 如何完美驾驭分布式事务与 XA 协议?.md
│ └── ShardingSphere 如何轻松驾驭 Seata 柔性分布式事务?.md
│ ├── activiti
│ └── activiti7-introduction.md
│ ├── algorithm
│ ├── .DS_Store
│ ├── basic
│ │ ├── 00-数据结构与算法专栏大纲.md
│ │ ├── dag-directed-acyclic-graph.md
│ │ ├── 【图解数据结构】外行人也能看懂的哈希表.md
│ │ └── 【图解数据结构与算法】LRU缓存淘汰算法面试时到底该怎么写.md
│ ├── leetcode
│ │ ├── .DS_Store
│ │ ├── 00-阿里秋招高频算法题汇总-基础篇.md
│ │ ├── 01-阿里秋招高频算法题汇总-中级篇.md
│ │ ├── 02-阿里秋招高频算法题汇总-进阶篇.md
│ │ ├── 03-字节秋招高频算法题汇总-基础篇.md
│ │ ├── 04-字节秋招高频算法题汇总-中级篇.md
│ │ └── 05-字节秋招高频算法题汇总-进阶篇.md
│ └── practise
│ │ └── 哈希算法原来有这么多应用场景!.md
│ ├── arthas
│ └── Arthas使用.md
│ ├── assembly
│ ├── api-gateway
│ │ └── todo.md
│ ├── idea-plugin
│ │ └── todo.md
│ └── middleware
│ │ └── todo.md
│ ├── bigdata
│ ├── 00-新一代数据栈将逐步替代国内单一“数据中台”.md
│ ├── 01-Hadoop.md
│ ├── 01-大数据的尽头是数据中台吗?.md
│ ├── 02-分布式对象存储设计原理.md
│ ├── 03-HDFS伪分布式环境搭建.md
│ ├── 03-构建数据中台的三要素:方法论、组织和技术.md
│ ├── 04-hdfs dfs命令详解.md
│ ├── 05-如何统一管理纷繁杂乱的数据指标?.md
│ ├── AB测试与灰度发布.md
│ ├── DolphinScheduler参数.md
│ ├── DolphinScheduler告警通知.md
│ ├── DolphinScheduler简介.md
│ ├── DolphinScheduler资源中心.md
│ ├── DolphinScheduler部署.md
│ ├── HDFS.md
│ ├── Hive 2.x 的安装与配置.md
│ ├── Hive专栏概述.md
│ ├── Hive修复分区.md
│ ├── Hive分区和分桶.md
│ ├── Hive执行原理.md
│ ├── OLAP平台架构演化历程.md
│ ├── Spark+ClickHouse实战企业级数据仓库专栏.md
│ ├── hiveserver2.md
│ ├── hive的严格模式.md
│ ├── 中小企业参考的商业大数据平台.md
│ ├── 作业帮基于 DolphinScheduler 的数据开发平台实践.md
│ ├── 大数据基准测试.md
│ ├── 大数据平台架构.md
│ ├── 安装下载Hadoop.md
│ ├── 对象存储.md
│ ├── 当大数据遇上物联网.md
│ ├── 数仓业务调研.md
│ ├── 数仓分层和数仓建模.md
│ ├── 数仓开发之ADS层.md
│ ├── 数仓开发之DIM层.md
│ ├── 数仓开发之DWD层.md
│ ├── 数仓开发之DWS层.md
│ ├── 数仓开发之ODS层.md
│ ├── 数仓数据导出.md
│ ├── 数仓逻辑模型.md
│ ├── 移动计算.md
│ ├── 维度建模理论之事实表.md
│ ├── 维度建模理论之维度表.md
│ ├── 轻松驾驭Hive数仓.md
│ └── 阿里云开源离线同步工具DataX3.0介绍.md
│ ├── biz-arch
│ ├── 00-优惠券系统设计 Coupon System.md
│ ├── 00-聚合支付架构从零到一.md
│ ├── 01-DMP系统简介.md
│ ├── 01-供应链域数据中台设计.md
│ ├── 02-供应链采购视角的业务系统架构.md
│ ├── 03-客服平台架构实践.md
│ ├── 04-数据质量中心系统设计.md
│ ├── 05-大厂CRM系统架构优化实战.md
│ ├── 05-用户画像是什么?.md
│ ├── 06-构建高质量的用户画像.md
│ ├── 06-运营后台系统设计.md
│ ├── 07-大厂报价查询系统性能优化之道.md
│ ├── 07-用户画像和特征工程.md
│ ├── 08-视频推荐索引构建.md
│ ├── System design: Uber.md
│ ├── cloud-efficiency-at-netflix.md
│ ├── data-gateway-a-platform-for-growing-and-protecting-the-data-tier.md
│ ├── enhancing-netflix-reliability-with-service-level-prioritized-load-shedding.md
│ ├── how-meta-improved-their-cache-consistency-to-99-99999999.md
│ ├── linkedin-architecture-which-enables-searching-a-message-within-150ms.md
│ ├── netflixs-distributed-counter-abstraction.md
│ ├── title-launch-observability-at-netflix-scale.md
│ ├── 事件中心架构概述.md
│ ├── 小游戏的大促实践.md
│ ├── 打造一个高并发的十万用户 IM 聊天系统,你需要了解这些架构设计技巧!.md
│ ├── 短链系统设计(design tiny url).md
│ ├── 设计消息通知系统(Notification System).md
│ └── 高性能排名系统的核心架构原理,架构师必看!.md
│ ├── career
│ ├── 03-新人程序员入行忠告.md
│ ├── 04-外企也半夜发布上线吗?.md
│ ├── 05-中外程序员到底有啥区别?.md
│ ├── 06-全球顶级架构师推荐的书单.md
│ ├── 08-程序员为何一直被唱衰?.md
│ ├── 09-程序员的“三步走”发展战略.md
│ ├── 10-为何我建议你学会抄代码.md
│ ├── 11-计师能去哪些央国企?.md
│ ├── Java-reading-list.md
│ ├── big-company-work-style.md
│ ├── efficient-professional-reading-list.md
│ ├── how-i-tricked-my-brain-to-be-addicted-to-coding.md
│ ├── life-beyond-career-growth.md
│ ├── mastering-architecture-diagrams.md
│ ├── moat-of-rd.md
│ ├── must-have-soft-skills-for-rd.md
│ ├── no-tech-no-future-for-rd.md
│ ├── p6-promotion-guide.md
│ ├── performance-review-guideline.md
│ ├── why-hard-work-didnt-get-you-promoted-the-overlooked-truth.md
│ ├── workplace-jargon.md
│ ├── workplace-rule.md
│ ├── 为什么中国的程序员有35岁危机.md
│ ├── 研发的立足之本到底是啥?.md
│ ├── 经常被压缩开发时间,延期还要背锅,如何破局?.md
│ └── 转型传统行业避坑指南.md
│ ├── chain
│ ├── 00-区块链专栏概述.md
│ ├── 01-以太坊智能合约与高级语言.md
│ ├── 01-联盟链入门.md
│ ├── 02-DAPP.md
│ ├── 02-认识Flow Cadence.md
│ ├── 03-Cadence基础语法.md
│ ├── 03-以太坊的EVM.md
│ ├── 03-百度联盟链Xuperchain核心概念.md
│ ├── 04-Solidity基础语法.md
│ ├── 04-XuperChain核心流程.md
│ ├── 05-Solidity开发智能合约.md
│ ├── 05-账本模型.md
│ ├── 06-智能合约.md
│ ├── 06-通过web3.js与以太坊客户端进行交互.md
│ ├── 07-Truffle.md
│ ├── 07-网络与共识.md
│ ├── 08-工作量证明.md
│ ├── 09-一文看懂以太坊智能合约!.md
│ ├── blockchain-smart-contract-helloworld-project.md
│ ├── 三分钟,快速了解区块链技术.md
│ └── 隐私计算技术原理.md
│ ├── ck
│ ├── clickhouse-jdbc.md
│ ├── clickhouse概述.md
│ ├── 为啥要学习ClickHouse.md
│ ├── 为啥适合OLAP?.md
│ ├── 单机安装部署.md
│ └── 客户端基本操作.md
│ ├── data-analysis
│ └── basic
│ │ ├── correct-data-analysis-learning-methods.md
│ │ ├── how-to-use-octoparse-for-data-scraping.md
│ │ ├── learning-path-data-mining.md
│ │ ├── 为啥要学习数据分析?.md
│ │ ├── 企业如何利用数据打造精准用户画像?.md
│ │ └── 如何自动化采集数据.md
│ ├── ddd-mall
│ ├── 04-BFF 架构简介.md
│ ├── 05-dddmall-database-spring-boot-starter.md
│ ├── 05-亿级用户如何分库分表.md
│ ├── 06-dddmall-ddd-framework-core.md
│ ├── 06-商品秒杀库存超卖问题.md
│ ├── 07-dddmall-designpattern-spring-boot-starter.md
│ ├── 07-亿级商品数据同步至ES的高效方案.md
│ ├── 07-建造者模式.md
│ ├── 07-责任链模式.md
│ ├── 08-订单超时未支付自动取消和库存回滚.md
│ ├── 09-【防止重复下单】分布式系统接口幂等性实现方案.md
│ ├── 10-百万数据量快速导入、导出MySQL.md
│ ├── 11-分库分表平滑上线&快速回滚.md
│ ├── DDD-Mall商城的公共组件设计.md
│ ├── building-product-information-caching-system.md
│ ├── dddmall-base-spring-boot-starter.md
│ ├── dddmall-cache-spring-boot-starter.md
│ ├── dddmall-common-spring-boot-starter.md
│ ├── dddmall-convention-spring-boot-starter.md
│ ├── dddmall-idempotent-spring-boot-starter.md
│ ├── 什么是DDD商城.md
│ └── 天天说架构,那CDN到底是什么?.md
│ ├── design
│ ├── 00-软件架构权衡-我们为什么以及如何进行权衡?.md
│ ├── 01-单一职责原则.md
│ ├── 01-软件架构权衡-无意识决策的问题.md
│ ├── 02-软件架构权衡-架构特性.md
│ ├── cell-based-architecture-adoption-guidelines.md
│ ├── cell-based-architecture-distributed-systems.md
│ ├── cell-based-architecture-resilient-fault-tolerant-systems.md
│ ├── evolution-software-architecture-mainframes-to-distributed-computing.md
│ ├── flyweight-pattern.md
│ ├── iterator-pattern.md
│ ├── measuring-technical-debt.md
│ ├── open-close-principle.md
│ ├── proxy-pattern.md
│ ├── rest-api-design-resource-modeling.md
│ ├── strategy-pattern.md
│ ├── template-pattern.md
│ ├── 【Java设计模式实战】单例模式.md
│ ├── 业务代码如何才能不再写出大串的if else?.md
│ ├── 代码的坏味道.md
│ ├── 分离关注点的意义.md
│ ├── 如何了解一个软件的设计?.md
│ ├── 建造者模式.md
│ ├── 架构之美:教你如何分析一个接口?.md
│ ├── 架构师教你kill祖传石山代码重复&大量ifelse.md
│ ├── 适配器模式.md
│ ├── 门面模式.md
│ └── 阿里P8架构师都是怎么分析软件模型的?.md
│ ├── develop
│ ├── design-pattern
│ │ └── todo.md
│ ├── framework
│ │ └── todo.md
│ ├── images
│ │ └── 责任链模式.png
│ └── standard
│ │ └── todo.md
│ ├── distdb
│ ├── 01-爆火的分布式数据库到底是个啥?.md
│ ├── 03-BASE 还能撑多久?强一致性才是事务处理的终极奥义!.md
│ ├── 18-分布式数据库的HTAP能统一OLTP和 OLAP吗?.md
│ ├── 21-查询执行引擎:加速聚合计算加速.md
│ └── bank-distributed-database-selection.md
│ ├── docker
│ ├── 00-Docker基础命令大全.md
│ ├── 01-标准化打包技术.md
│ ├── Docker环境搭建.md
│ └── 通俗易懂的图文解密Docker容器网络.md
│ ├── es
│ ├── 02-MacOS下载安装启动ES和Kibana.md
│ ├── 03-核心概念之NRT Document Index 分片 副本.md
│ ├── 04-Kibana常见RESTful API操作.md
│ ├── 05-倒排索引与分词.md
│ ├── 07-整合进 SpringBoot 项目.md
│ ├── ES专栏大纲.md
│ ├── ES基本概念.md
│ └── building-product-search-system-with-es.md
│ ├── ffmpeg
│ ├── audio-video-roadmap.md
│ └── video-basic.md
│ ├── flink
│ ├── 01-Flink实战-概述.md
│ ├── 05-Flink实战DataStream API编程.md
│ ├── Flink部署及任务提交.md
│ ├── flink-architecture.md
│ ├── flink-beginner-case-study.md
│ ├── flink-broadcast-state.md
│ ├── flink-cep.md
│ ├── flink-checkpoint.md
│ ├── flink-data-latency-solution.md
│ ├── flink-programming-paradigms-core-concepts.md
│ ├── flink-state-backend.md
│ ├── flink-state-management.md
│ └── streaming-connectors-programming.md
│ ├── go-gateway
│ ├── 00-Go微服务网关专栏概述.md
│ └── open-systems-interconnection-model.md
│ ├── go
│ ├── 00-Go概述.md
│ ├── 01-macOS 安装go配置GOROOT GOPATH.md
│ ├── 02-Go基本语法.md
│ └── 03-Go的数组array和切片slice语法详解.md
│ ├── hbase
│ └── hbase-scan.md
│ ├── java
│ ├── 00-Java并发编程.md
│ ├── 01-synchronized原理.md
│ ├── 02-volatile原理.md
│ ├── 03-ReentrantLock与AQS.md
│ ├── 04-线程池以及生产环境使用.md
│ ├── 05-京东并行框架asyncTool如何针对高并发场景进行优化?.md
│ ├── IntelliJ IDEA 2024.1 最新变化.md
│ ├── Java16-new-features.md
│ ├── Java21-new-features.md
│ ├── Java22-new-features.md
│ ├── Java23-new-features.md
│ ├── Java9-new-features.md
│ ├── What’s-New-in-IntelliJ-IDEA-2024.2.md
│ ├── What’s-New-in-IntelliJ-IDEA-2024.3.md
│ ├── java-news-roundup-jun02-2025.md
│ ├── java-se-support-roadmap.md
│ ├── java2024.md
│ ├── java21-virtual-threads-where-did-my-lock-go.md
│ ├── java24-new-features.md
│ ├── jdk14-new-features-complete-guide.md
│ ├── understanding-java17-new-features-sealed-classes.md
│ └── 并发编程专栏概述.md
│ ├── jvm
│ ├── 00-G1垃圾收集器的日志格式.md
│ ├── 00-JDK为何自己首先破坏双亲委派模型.md
│ ├── 01-JVM虚拟机-上篇.md
│ ├── 01-JVM虚拟机.md
│ ├── 02-JVM虚拟机-下篇.md
│ ├── JDK性能调优神器.md
│ ├── JVM专栏概述.md
│ ├── Java NIO为何导致堆外内存OOM了?.md
│ ├── Java 性能调优:优化 GC 线程设置.md
│ ├── Metadata GC Threshold in Java.md
│ ├── deep-dive-into-jvm-runtime-data-areas-from-pc-to-metaspace.md
│ ├── 一次由热部署导致的OOM排查经历.md
│ ├── 对象内存分配及Minor GC和Full GC全过程.md
│ ├── 线上频繁Full GC,原来是外包同学不合理设置JVM参数!.md
│ ├── 队列积压了百万条消息,线上直接OOM了!.md
│ └── 高并发BI系统避免频繁Y-GC.md
│ ├── k8s
│ ├── 00-Kubernetes的基本架构.md
│ ├── 00-为啥选择 kubesphere.md
│ ├── 01-一键部署神器kubeadm.md
│ ├── 02-Kubernetes核心组件之kube-proxy实现原理.md
│ ├── 23-0-声明式API.md
│ ├── 23-1-Envoy.md
│ ├── Kubernetes容器日志处理方案.md
│ ├── kubectl命令.md
│ ├── kubernetes-workloads-controllers-deployment.md
│ ├── nature-of-kubernetes.md
│ ├── pod-in-kubernetes.md
│ ├── 使用 Kubernetes 部署 Nginx 应用.md
│ └── 快速搭建Kubernetes集群.md
│ ├── kafka
│ ├── 00-Kafka专栏大纲.md
│ ├── 01-为何大厂都选择Kafka作为消息队列.md
│ ├── 08-全网最全图解Kafka适用场景.md
│ ├── 09-消息队列的消息大量积压怎么办?.md
│ ├── 15-基于kafka实现延迟队列.md
│ ├── Kafka门派知多少.md
│ ├── kafka-operations-tool-exploring-adminclient-principles-and-practices.md
│ ├── kafka-transaction-implementation.md
│ └── kafka-versions.md
│ ├── linux
│ ├── 00-操作系统专栏大纲.md
│ ├── 01-Linux命令.md
│ ├── 02-进程管理.md
│ ├── 04-还记得纸带编程吗?.md
│ └── 超线程(Hyper-Threading),单指令多数据流(SIMD)技术.md
│ ├── low-code
│ ├── 01-低代码平台到底是什么样的?.md
│ └── 为什么“低代码”是未来趋势?.md
│ ├── mgr
│ ├── 00-咋带领团队做成事?.md
│ ├── 00-如何学习项目管理专栏.md
│ └── 01-避免新手常犯的项目管理错误.md
│ ├── monitor
│ ├── 00-你居然还去服务器上捞日志,搭个日志收集系统难道不香么!.md
│ ├── 01-性能分析思路.md
│ ├── 03-Loki 日志监控.md
│ ├── performance-optimization-guide.md
│ └── 并发用户、RPS、TPS的解读.md
│ ├── mysql
│ ├── 00-MySQL专栏大纲.md
│ ├── InnoDB架构设计.md
│ ├── Java业务系统是怎么和MySQL交互的?.md
│ ├── Java生态中性能最强数据库连接池HikariCP.md
│ ├── MySQL新特性.md
│ ├── MySQL查询优化.md
│ ├── MySQL深分页调优实战.md
│ ├── how-to-use-indexes-when-grouping-in-sql.md
│ ├── mysql-architecture-design.md
│ ├── mysql-read-write-splitting.md
│ ├── mysql-transaction-isolation-mechanism.md
│ ├── online-sql-deadlock-incident-how-to-prevent-deadlocks.md
│ ├── optimize-slow-queries-massive-row-deletions.md
│ ├── what-is-new-in-mysql9.md
│ ├── 一文看懂这篇MySQL的锁机制.md
│ ├── 为什么临时表可以重名?.md
│ ├── 为什么阿里不推荐使用MySQL分区表?.md
│ └── 亿级数据量商品系统的SQL调优实战.md
│ ├── nacos
│ └── 00-Nacos 版本.md
│ ├── neo4j
│ └── neo4j-revolutionary-power-of-graph-databases.md
│ ├── netty
│ ├── (06-1)-ChannelHandler 家族.md
│ ├── (08)-学习Netty BootStrap的核心知识,成为网络编程高手!.md
│ ├── 01-Netty源码面试实战+原理(一)-鸿蒙篇.md
│ ├── 11-4-解码基于分隔符的协议和基于长度的协议.md
│ ├── 18-检测新连接.md
│ ├── ChannelPipeline接口.md
│ ├── java-lock-optimization-practice-netty-examples_boost-concurrency-performance.md
│ ├── netty-basic-components.md
│ ├── netty-off-heap-memory-leak-detection.md
│ └── use-netty-to-handle-large-data-efficiently.md
│ ├── network
│ ├── TCP协议详解.md
│ ├── TCP连接的建立和断开受哪些系统配置影响?.md
│ ├── 天天说架构,那CDN到底是什么?.md
│ └── 计算机网络-网络层原理.md
│ ├── opensearch
│ └── opensearch-3-0-enhances-vector-database-performance.md
│ ├── other
│ └── guide-to-reading.md
│ ├── product-center
│ ├── 00-商品中心的spu、sku设计.md
│ ├── 01-电商商品中心解密:仅凭SKU真的足够吗?.md
│ └── 02-大厂电商设计解析之商品管理系统.md
│ ├── product
│ ├── book
│ │ └── todo.md
│ └── pdf
│ │ └── todo.md
│ ├── python
│ ├── 00-macOS和Linux安装和管理多个Python版本.md
│ └── Installing packages into 'Python 3.9' requires administrator privileges.md
│ ├── rabbitmq
│ ├── 00-RabbitMQ实战下载与安装.md
│ ├── 04-RabbitMQ & Spring整合开发.md
│ ├── 08-RabbitMQ的七种队列模式.md
│ ├── 12-RabbitMQ实战-消费端ACK、NACK及重回队列机制.md
│ ├── RabbitMQ消费端幂等性概念及解决方案.md
│ ├── RabbitMQ的 RPC 消息模式你会了吗?.md
│ └── 用了这么久的RabbitMQ异步编程竟然都是错的.md
│ ├── reactive
│ ├── 00-Spring响应式编程.md
│ ├── 01-想让系统更具有弹性?了解背压机制和响应式流的秘密!.md
│ ├── 04-Spring为何偏爱Reactor响应式编程框架.md
│ ├── 05-流式操作:如何使用 Flux 和 Mono 高效构建响应式数据流?.md
│ ├── applicable-scenarios-for-reactive-programming.md
│ └── spring-5-reactive-programming-high-performance-full-stack-apps.md
│ ├── redis
│ ├── 00-数据结构的最佳实践.md
│ ├── 01-Redis和ZK分布式锁优缺点对比以及生产环境使用建议.md
│ ├── 02-Redisson可重入锁加锁源码分析.md
│ ├── 03-Redisson公平锁加锁源码分析.md
│ ├── 04-Redisson读写锁加锁机制分析.md
│ ├── 05-缓存读写策略模式详解.md
│ ├── 06-如何快速定位 Redis 热 key.md
│ ├── 12-Redis 闭源?.md
│ ├── Redis Quicklist.md
│ ├── Redis异步子线程原理详解.md
│ ├── Redis的RDB源码解析.md
│ ├── Redis的整数数组和压缩列表.md
│ ├── Sorted sets、zset数据结构详解.md
│ └── redis-agpl-license.md
│ ├── risk-control
│ ├── coupon-distribution-risk-control-challenges.md
│ ├── coupon-fraud-grey-market-chain.md
│ ├── flink-real-time-risk-control-system-overview.md
│ ├── reasons-for-choosing-groovy-for-risk-control-engine.md
│ ├── risk-control-engine-architecture-design.md
│ └── risk-control-rules-thresholds-for-coupon-scenarios.md
│ ├── road-map
│ └── todo.md
│ ├── rpc
│ ├── 04-RPC框架在网络通信的网络IO模型选型.md
│ ├── 11-RPC的负载均衡.md
│ ├── RPC-Traffic-Replay.md
│ ├── rpc-retry-mechanism.md
│ └── 熔断限流.md
│ ├── rules-engine
│ └── drools
│ │ └── drools-core-guide-configuration-to-drl-and-decision-tables.md
│ ├── seata
│ ├── 01-Seata客户端依赖坐标引入与踩坑排雷.md
│ ├── 02-Seata客户端全局事务配置与实现.md
│ ├── 03-Seata柔性事务.md
│ ├── 04-Seata是什么?.md
│ ├── 05-开始.md
│ └── docker-install-configure-seata-server.md
│ ├── security
│ ├── 03-OAuth2.0实战-轻松学会使用JWT,让你的OAuth2.0实现更加安全高效!.md
│ ├── 07-你确定懂OAuth 2.0的三方软件和受保护资源服务?.md
│ └── OAuth 2.0实战-为什么要先获取授权码code.md
│ ├── sentinel
│ ├── basic-api-resource-rule.md
│ ├── origin-authority-control.md
│ └── spring-boot-integration-with-sentinel-practical-tutorial-from-dependency-to-custom-flow-control-and-monitoring.md
│ ├── serverless
│ └── serverless-is-a-scam.md
│ ├── sideline
│ ├── 16-精益独立开发实践.md
│ ├── 17-用户画像都是怎么产生的?.md
│ ├── 20-个人支付解决方案.md
│ ├── 21-处理用户反馈和增长优化.md
│ └── 22-大纲的注意点.md
│ ├── spark
│ ├── 00-Spark安装及启动.md
│ ├── 00-为啥要学习Spark Streaming.md
│ ├── 01-Spark Streaming专栏概述.md
│ ├── 01-Spark的Local模式与应用开发入门.md
│ ├── 02-Spark Streaming小试流式处理.md
│ ├── 03-SparkSQL入门.md
│ ├── 04-SparkSQL的API编程之DataFrame.md
│ ├── 05-快速理解SparkSQL的DataSet.md
│ ├── 06-RDD与DataFrame的互操作.md
│ ├── 07-Spark的Data Sources.md
│ ├── 07-回归算法.md
│ ├── 08-Spark SQL整合Hive.md
│ ├── Spark架构.md
│ ├── spark-ml-basic-statistics.md
│ └── 为啥要学习Spark?.md
│ ├── spider
│ └── 00-爬虫基础.md
│ ├── spring
│ ├── 00-可能是全网最全的SpringBoot启动流程源码分析.md
│ ├── 01-HelloSpringBoot应用程序.md
│ ├── 02-实现http请求的异步长轮询.md
│ ├── SpringBoot3.4-release.md
│ ├── SpringBoot默认线程池.md
│ ├── SpringMVC-AsyncHandlerInterceptor.md
│ ├── SpringMVC-DispatcherServlet-doDispatch.md
│ ├── SpringMVC-HandlerInterceptor.md
│ ├── SpringMVC-service-doDispatch.md
│ ├── Spring之BeanNameAware和BeanFactoryAware接口.md
│ ├── Spring框架使用了哪些设计模式.md
│ ├── farewell-bean-not-found-easily-solve-spring-boot-package-scanning-issues.md
│ ├── mastering-multi-tenancy-with-spring-multi-tenancy-library.md
│ ├── spring-cloud
│ │ ├── Spring Cloud Alibaba大纲.xmind
│ │ ├── SpringCloudAlibaba介绍.md
│ │ ├── SpringCloudGateway之Filter多过程介绍.md
│ │ ├── SpringCloudGateway之灰度发布篇.md
│ │ ├── SpringCloudGateway之熔断集成篇.md
│ │ ├── SpringCloudGateway之统一鉴权篇.md
│ │ ├── SpringCloudGateway之限流集成篇.md
│ │ ├── SpringCloudGateway之高性能篇.md
│ │ ├── SpringCloudGateway工作原理与链路图.md
│ │ ├── SpringCloudGateway核心之Predicate.md
│ │ ├── practise
│ │ │ └── 01-Segment为何永别微服务了?.md
│ │ └── todo.md
│ ├── why-spring-bean-difficult-birth-overcome-constructor-injection-dependencies-and-ambiguity.md
│ ├── 别小看Spring过滤器,这些知识点你必须得掌握.md
│ ├── 这次彻底搞懂IoC容器依赖注入的源码.md
│ └── 阿里四面:你知道Spring AOP创建Proxy的过程吗?.md
│ ├── tomcat
│ ├── 00-不知道这些Servlet规范、容器,还敢说自己是Java程序员.md
│ ├── 01-Jetty架构设计之Connector、Handler组件.md
│ ├── 03-Tomcat的生命周期管理.md
│ ├── 04-Tomcat实现热部署、热加载原理解析.md
│ ├── 05-Tomcat如何打破双亲委派机制实现隔离Web应用的?.md
│ └── how-to-solve-high-cpu-usage-in-tomcat-process.md
│ ├── trade
│ ├── 00-如何防止订单二次重复支付?.md
│ ├── 01-扫码支付后都发生了啥?.md
│ ├── 02-大厂的第三方支付业务架构设计.md
│ ├── high-avail-payments.md
│ └── wechat-pay-development-guide-avoid-pitfalls.md
│ ├── vue
│ ├── 01-Vue开发实战.md
│ ├── 05-教你快速搭建Vue3工程化项目.md
│ ├── Vuex设计Vue3项目的数据流.md
│ ├── goodbye-jquery-thinking-create-checklist-apps-with-vue-js-experience-the-charm-of-data-driven.md
│ ├── router.md
│ ├── table.md
│ ├── vue-js-vs-axios-practical-guide-from-ajax-requests-to-api-proxy-configuration.md
│ └── vue2-to-vue3.md
│ ├── zqy
│ ├── JVM
│ │ └── JVM虚拟机基础.md
│ ├── MySQL
│ │ └── MySQL高手实战.md
│ ├── Redis
│ │ └── 基于电商场景的高并发Redis实战.md
│ ├── RocketMQ
│ │ ├── RocketMQ基础.md
│ │ └── 基于电商场景的高并发RocketMQ实战.md
│ ├── ZooKeeper
│ │ └── ZooKeeper高手实战.md
│ └── 面试题
│ │ ├── 01-分布式技术面试实战.md
│ │ ├── 02-注册中心和网关面试实战.md
│ │ ├── 03-生产部署面试实战.md
│ │ ├── 04-分布式锁、幂等性问题实战.md
│ │ ├── 05-Java基础面试实战.md
│ │ ├── 06-Spring面试实战.md
│ │ ├── 07-计算机网络面试实战.md
│ │ ├── 08-数据库面试实战.md
│ │ ├── 09-网络通信及可见性面试实战.md
│ │ ├── 10-Java 系统架构安全面试实战.md
│ │ ├── 11-深挖网络 IO 面试实战.md
│ │ ├── 12-分布式架构、性能优化、场景设计面试实战.md
│ │ ├── gaopin
│ │ ├── 00-RocketMQ可靠性、重复消费解决方案.md
│ │ ├── 01-RocketMQ有序性、消息积压解决方案.md
│ │ ├── 02-Redis的IO多路复用.md
│ │ └── 03-ZooKeeper运行原理.md
│ │ ├── jiagou
│ │ ├── 01-B站评论系统架构设计.md
│ │ └── 02-该从哪些方面提升系统的吞吐量?.md
│ │ ├── mianjing
│ │ ├── 00-淘天提前批面试.md
│ │ ├── 01-饿了么一面.md
│ │ ├── 02-美团优选后端一面.md
│ │ ├── 03.腾讯后端一面.md
│ │ ├── 04.美团优选后端一面.md
│ │ ├── 05.携程暑期实习一面.md
│ │ └── 06.携程暑期实习二面.md
│ │ ├── 面试突击.md
│ │ ├── 面试题-Java基础.md
│ │ ├── 面试题-MySQL.md
│ │ ├── 面试题-Netty.md
│ │ ├── 面试题-Redis.md
│ │ └── 面试题-场景题.md
│ └── zsxq
│ ├── about
│ └── todo.md
│ ├── booklet
│ └── todo.md
│ ├── material
│ └── todo.md
│ ├── memorabilia
│ └── todo.md
│ ├── other
│ └── todo.md
│ ├── project
│ └── todo.md
│ └── source-code
│ └── todo.md
├── package-lock.png
├── package.json
└── security
├── oauth2_and_encryption.drawio
└── oauth2_and_encryption_diagram.drawio
/.gitignore:
--------------------------------------------------------------------------------
1 | /.idea/
2 |
3 | /package-lock.json
4 |
5 | /node_modules/
6 |
7 | /.site/
8 |
9 | /.temp/
10 |
--------------------------------------------------------------------------------
/.idea/Java-Interview-Tutorial.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.vscode/.server-controller-port.log:
--------------------------------------------------------------------------------
1 | {
2 | "port": 9145,
3 | "time": 1744085260411,
4 | "version": "0.0.3"
5 | }
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "cSpell.words": [
3 | "clickhouse",
4 | "dddmall",
5 | "distdb",
6 | "OLAP",
7 | "println",
8 | "rabbitmq",
9 | "Servlet",
10 | "springframework"
11 | ],
12 | "Codegeex.RepoIndex": true,
13 | "files.autoSave": "afterDelay"
14 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 编程严选网
2 |
3 | ## 0 本地启动项目
4 | 1. 安装Node.js
5 | 2. 下载依赖:npm install
6 | 3. 启动服务: npm run dev -- --port 8081
7 |
8 | https://www.bilibili.com/video/BV1vb411m7NY
9 |
10 | 视频前两节即可学会本地启动 Vuepress项目,还可学到其他相关配置。
11 |
12 | ## 1 图片调整路径
13 | docs/.vuepress/public/images 存储网站本身展示所需宣传营销图片。
14 |
15 | 文章中的绘图不建议存储源文件,请直接使用阿里云 oos 对象存储来存储图片或者白嫖使用 CSDN 的博客图床
16 |
17 | ## 2 提交文章
18 |
19 | ### 2.1 新增 md 文件(必须)
20 |
21 | 在 md 目录新建 concurrency 目录,新建00-Java并发编程.md文件,将文章内容放进去
22 |
23 | ### 2.2 修改 config.js
24 |
25 | #### 2.2.1 配置
26 |
27 | - 专栏名称(新增专栏时必须)
28 | - 文章路径(新增文章非必须)
29 | ```js
30 | {
31 | text: '并发编程',
32 | items: [
33 | {text: '00-Java并发编程', link: '/md/concurrency/00-Java并发编程.md'},
34 | ]
35 | },
36 | ```
37 | #### 2.2.2 配置专栏侧边导航栏(必须)
38 | 如
39 | ```js
40 | "/md/concurrency/": [
41 | {
42 | title: "并发编程",
43 | collapsable: false,
44 | sidebarDepth: 0,
45 | children: [
46 | "00-Java并发编程.md"
47 | ]
48 | }
49 | ],
50 | ```
51 |
52 | 注意,该步骤不要带有()、【】、空格等特殊字符!!!
53 | 文章标题是可以有空格的,不然也就没法正常断句了!
54 | ### 2.3 本地调试
55 | 浏览器前端能正常看到文章,即可提交代码
56 |
57 | ## 3 Git GUI 工具
58 | 建议下载 Github Desktop,可视化提交文章相关数据。
59 | 注意本仓库分为 master、main两个分支,只在 main 分支操作文章,勿碰 master 分支!
60 |
61 | ## FAQ
62 | 文章名称不要带有括号、#等特色字符
63 |
64 | 文章内容不要带有尖括号、#等特殊字符,如
65 | ```
66 | - Java API中,用户需要使用Dataset表示DataFrame
67 | ```
68 | 会导致整篇文章不显示!
69 |
70 | 对此,需将其包进一个代码块里,如:
71 | `Dataset`
72 | 这样就能正常显示了。
73 |
74 | 文章内容不要使用 html 标签渲染,也会导致空白页!
--------------------------------------------------------------------------------
/build.sh:
--------------------------------------------------------------------------------
1 | NODE_OPTIONS=--max-old-space-size=14096 npm run build
--------------------------------------------------------------------------------
/docs/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/.DS_Store
--------------------------------------------------------------------------------
/docs/.vuepress/components/HideArticle.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
25 |
26 |
--------------------------------------------------------------------------------
/docs/.vuepress/enhanceApp.js:
--------------------------------------------------------------------------------
1 | export default ({router}) => {
2 | /**
3 | * 路由切换事件处理
4 | */
5 | router.beforeEach((to, from, next) => {
6 | //触发百度的pv统计
7 | if (typeof _hmt != "undefined") {
8 | if (to.path) {
9 | _hmt.push(["_trackPageview", to.fullPath]);
10 | }
11 | }
12 | // continue
13 | next();
14 | });
15 | };
--------------------------------------------------------------------------------
/docs/.vuepress/public/CNAME:
--------------------------------------------------------------------------------
1 | javaedge.cn
2 |
--------------------------------------------------------------------------------
/docs/.vuepress/public/bcloud_nginx_user.conf:
--------------------------------------------------------------------------------
1 | error_page 404 http://www.javaedge.cn/#/index;
2 | location ~ .*\.(html|js)$ {
3 | #禁止缓存,每次都从服务器请求
4 | // add_header Cache-Control no-store;
5 | }
--------------------------------------------------------------------------------
/docs/.vuepress/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/.vuepress/public/favicon.ico
--------------------------------------------------------------------------------
/docs/.vuepress/public/images/12306/12306项目文档.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/.vuepress/public/images/12306/12306项目文档.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/images/personal/javaedge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/.vuepress/public/images/personal/javaedge.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/images/personal/qrcode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/.vuepress/public/images/personal/qrcode.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/images/personal/xingqiu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/.vuepress/public/images/personal/xingqiu.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/images/system/banner.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/.vuepress/public/images/system/banner.jpg
--------------------------------------------------------------------------------
/docs/.vuepress/public/images/system/blog-02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/.vuepress/public/images/system/blog-02.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/images/system/download-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/.vuepress/public/images/system/download-2.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/images/system/logo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/.vuepress/public/images/system/logo.jpg
--------------------------------------------------------------------------------
/docs/.vuepress/public/images/system/toc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/.vuepress/public/images/system/toc.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/images/system/toggle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/.vuepress/public/images/system/toggle.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/images/system/wexin4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/.vuepress/public/images/system/wexin4.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/images/system/xingqiu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/.vuepress/public/images/system/xingqiu.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/js/btwplugin.js:
--------------------------------------------------------------------------------
1 | window.onload = function() {
2 | themeDefaultContent = $(
3 | '#app > .theme-container>.page > .theme-default-content'
4 | );
5 |
6 | themeDefaultContent.attr('id', 'container');
7 | btw = new BTWPlugin(); // 注意btw需要是个全局变量,把const去掉
8 | btw.init({
9 | id: 'container',
10 | blogId: '31809-1711934972129-598',
11 | name: 'JavaEdge',
12 | qrcode: 'https://javaedge-1256172393.cos.ap-shanghai.myqcloud.com/qrcode_for_gh_ab5f6d46c1ff_258.jpg',
13 | keyword: '编程严选网',
14 | });
15 | };
--------------------------------------------------------------------------------
/docs/.vuepress/public/js/global.js:
--------------------------------------------------------------------------------
1 | window.onload = function () {
2 | let $article = $('.theme-default-content > h1');
3 | if ($article.length <= 0) return null;
4 |
5 | let clientWidth = $article[0].clientWidth;
6 |
7 | // 根据ID获取iframe对象
8 | var ifr = document.getElementById('B-Video');
9 |
10 | if (ifr) {
11 | ifr.style.width = clientWidth + 'px';
12 | if (clientWidth < 450) {
13 | ifr.style.height = (523 * clientWidth) / 700 + 'px'
14 | } else {
15 | ifr.style.height = '450px'
16 | }
17 | }
18 |
19 | };
--------------------------------------------------------------------------------
/docs/.vuepress/public/robots.txt:
--------------------------------------------------------------------------------
1 | Sitemap: https://javaedge.cn/sitemap.xml
2 | User-agent: *
3 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/index.styl:
--------------------------------------------------------------------------------
1 | body
2 | font-size 0.95rem
3 |
4 | // markdown blockquote
5 | blockquote
6 | font-size 0.95rem
7 | color #2c3e50;
8 | border-left .5rem solid #42b983
9 | background-color #f3f5f7
10 | margin 1rem 0
11 | padding 1rem 1rem 1rem 1rem
12 | & > p
13 | margin 0
14 |
15 | // markdown h1
16 | h1
17 | font-size 1.8rem
18 | padding-bottom 1rem
19 | border-bottom 1px solid $borderColor
20 |
21 | // markdown h2
22 | h2
23 | font-size 1.55rem
24 | border-bottom 0px solid $borderColor
25 |
26 | .theme-default-content h4
27 | font-size 1.1rem
28 | text-decoration underline
29 |
30 | // sidebar
31 | .sidebar
32 | width: 18rem
33 | font-size: 15px
--------------------------------------------------------------------------------
/docs/.vuepress/styles/palette.styl:
--------------------------------------------------------------------------------
1 | // 内容的宽度
2 | $contentWidth = 100%
3 |
4 | // 首页的宽度
5 | $homePageWidth = 1200px
6 |
7 | $MQNarrow ?= 1280px
8 |
9 | // 颜色
10 | $accentColor = #3eaf7c
11 | $textColor = #2c3e50
12 | $borderColor = #eaecef
13 | $codeBgColor = #282c34
--------------------------------------------------------------------------------
/docs/.vuepress/theme/components/DropdownTransition.vue:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
12 |
28 |
29 |
34 |
--------------------------------------------------------------------------------
/docs/.vuepress/theme/components/FullScreenBtn.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 全屏看
5 |
6 |
7 |
8 |
9 |
32 |
--------------------------------------------------------------------------------
/docs/.vuepress/theme/components/PageSidebarBackToTop.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
27 |
28 |
29 |
30 |
69 |
70 |
--------------------------------------------------------------------------------
/docs/.vuepress/theme/components/PageSidebarToc.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
11 |
12 |
88 |
--------------------------------------------------------------------------------
/docs/.vuepress/theme/index.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | extend: '@vuepress/theme-default'
3 | };
4 |
--------------------------------------------------------------------------------
/docs/.vuepress/theme/styles/wrapper.styl:
--------------------------------------------------------------------------------
1 | $wrapper
2 | max-width $contentWidth
3 | margin 0 auto
4 | padding 2rem 2.5rem
5 | @media (max-width: $MQNarrow)
6 | padding 1.2rem
7 | @media (max-width: $MQMobileNarrow)
8 | padding 1rem
9 |
--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | home: true
3 | heroImage: /images/system/logo.jpg
4 | actionLinks:
5 | - link: /md/other/guide-to-reading.md
6 | text: 开始阅读 →
7 | class: primary
8 | - link: https://wx.zsxq.com/dweb2/index/group/51112182212124
9 | text: 知识星球
10 | class: secondary
11 | - link: http://www.javaedge.cn:3000/#/article/76
12 | text: 后端技术专家学习路线 👣
13 | class: secondary
14 | - link: http://www.javaedge.cn:3000/#/index
15 | text: 网站 💐
16 | class: secondary
17 | footer:
18 |
19 | 皖ICP备2024059525号 | Copyright © JavaEdge
20 | footerHtml: true
21 | ---
22 |
23 | ---
24 |
--------------------------------------------------------------------------------
/docs/md/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/md/.DS_Store
--------------------------------------------------------------------------------
/docs/md/12306/Builder模式在项目设计中的应用.md:
--------------------------------------------------------------------------------
1 | # **Builder模式在项目设计中的应用**
2 |
3 | ## Builder模式简介:
4 | 构建者模式(Builder Pattern)是一种对象创建型设计模式,它提供了一种灵活的解决方案,用于在创建复杂对象时将构造过程与其表示分离,以便相同的构建过程可以创建不同的表示。这种模式通常用于那些具有多个组成部分且这些部分经常变化的场景中,例如创建一个复杂的用户界面或一个多步骤的复杂算法。
5 |
6 | ### 构建者模式的应用场景
7 |
8 | 构建者模式适用于以下几种情况:
9 |
10 | - 1. **对象构造复杂**:当一个对象的构建比较复杂时,可以使用构建者模式将复杂对象的构建过程抽象出来,是的这个抽象过程和具体的产品类分离,使得客户端不需要知道其具体的构建细节。
11 | - 2. **对象内部构建有多个步骤**:如果一个对象有多个构建步骤,并且希望允许用户以任意顺序提供这些步骤的信息,那么可以使用构建者模式来提供更灵活的构建过程。
12 | - 3. **对象构建需要多个简单对象组合**:如果一个对象是由多个简单的对象组合而成,而这些简单的对象又有不同的组合方式和可选的组合项,构建者模式可以帮助简化这种组合逻辑。
13 | - 4. **构建与表示分离**:当需要将一个复杂对象的构建过程与其最终表示分离时,构建者模式可以将这两个方面解耦,使得同样的构建过程可以创建出不同的表示。
14 |
15 | ### 构建者模式的实现
16 |
17 | 构建者模式通常包括以下几个角色:
18 |
19 | - 1. **Builder**:为创建一个Product对象的各个部件指定抽象接口,具体构建者实现该接口以构造和装配该产品的各个部件。
20 | - 2. **ConcreteBuilder**:实现Builder接口,构建和装配各个部分,最终返回一个构造完毕的Product对象。
21 | - 3. **Director**:负责按照特定顺序组装各个部件,并返回一个构建好的实例或者使用构建者实例来构建最终的对象。
22 | - 4. **Product**:是最终被构建出来的复杂对象。
23 |
24 | #### 示例代码
25 |
26 | 下面是12306项目中展示使用构建者模式的案例。
27 |
28 | ```java
29 | //产品
30 |
31 | // 构建者角色
32 | /**
33 | * Builder 模式抽象接口
34 | *
35 | */
36 | public interface Builder extends Serializable {
37 |
38 | /**
39 | * 构建方法
40 | *
41 | * @return 构建后的对象
42 | */
43 | T build();
44 | }
45 |
46 | // 具体构建者
47 | // todo
48 |
49 | // 指导者角色
50 | // todo
51 |
52 | // 实际业务场景使用
53 | //todo
54 |
55 | ```
56 |
57 | ### 构建者模式的优点与缺点
58 |
59 | **优点:**
60 | - **封装性良好**:客户端无需了解产品内部的组成细节,只需要知道如何通过构建者来构造它即可。
61 | - **易于扩展**:可以通过增加新的具体构建者来轻松扩展系统,而不影响其他代码。
62 | - **分步构建,链式调用**:可以在构建过程中逐步完成,也可以采用链式调用的方式,提高易用性和可读性。
63 |
64 | **缺点:**
65 | - **设计相对复杂**:相比直接使用构造函数或工厂方法创建对象,构建者模式的设计更为复杂。
66 | - **违反单一职责原则**:构建者除了构建产品的职责外,还需要知道如何一步步构建,这增加了其职责。
67 | - **对象创建成本高**:因为构建者的设计和实现较为复杂,所以相比于直接创建对象,构建者模式可能会增加额外的时间和空间成本。
68 |
69 | ### 结论
70 |
71 | 构建者模式在创建复杂对象时非常有用,尤其是当对象的构建过程需要多个步骤,并且这些步骤可以灵活配置时。它提供了一个清晰的方式来组织和封装一个复杂对象的构建过程,同时保持了系统的灵活性和可扩展性。然而,它的复杂性可能不适合所有的场景,所以在决定使用构建者模式之前,应该仔细评估它带来的额外复杂度是否值得。
--------------------------------------------------------------------------------
/docs/md/12306/使用JUC中的核心组件来优化业务功能性能.md:
--------------------------------------------------------------------------------
1 | # **使用JUC中的核心组件来优化业务功能性能**
2 |
3 | ## JUC简介:
4 | 在Java并发编程中,`java.util.concurrent`(简称JUC)工具类库提供了强大的线程管理和任务执行的工具,它允许开发者能够更加容易地写出高效且线程安全的代码。使用JUC进行优化可以显著提升系统的性能和响应能力,同时降低开发复杂性。本文将介绍如何使用JUC中的一些核心组件来优化业务功能性能。
5 |
6 | ### JUC的核心组件
7 |
8 | JUC包含了许多用于处理并发的实用工具,其中一些关键的组件包括:
9 |
10 | 1. **ExecutorService 和 ThreadPoolExecutor**:提供线程池管理,可以有效地重用线程,减少创建和销毁线程的开销。
11 | 2. **CountDownLatch 和 CyclicBarrier**:用于协调多个线程之间的同步操作。
12 | 3. **Semaphore**:限流器,用于控制同时访问资源的线程数量。
13 | 4. **Future 和 CompletableFuture**:代表异步计算的结果,允许应用程序在计算完成之前继续执行其他任务。
14 | 5. **ConcurrentHashMap** 和其他并发集合:提供高并发的数据结构,支持高效的并发访问。
15 |
16 | ### 使用JUC优化业务功能
17 |
18 | #### 线程池优化
19 |
20 | 线程池是管理线程的强大工具,它可以极大地减少在执行大量异步任务时因频繁创建和销毁线程而产生的性能开销。使用`Executors`类可以方便地创建一个线程池:
21 |
22 | ```java
23 | ExecutorService executor = Executors.newFixedThreadPool(10);
24 | ```
25 |
26 | 在需要执行任务时,只需将`Runnable`或`Callable`任务提交给线程池:
27 |
28 | ```java
29 | executor.submit(() -> {
30 | // 业务逻辑代码
31 | });
32 | ```
33 |
34 | 当所有任务完成后,记得关闭线程池以释放资源:
35 |
36 | ```java
37 | executor.shutdown();
38 | ```
39 |
40 | #### 同步工具类优化
41 |
42 | 在多线程环境下对数据进行操作时,可以使用`CountDownLatch`、`CyclicBarrier`和`Semaphore`等同步辅助类来控制线程的执行顺序和数量。例如,使用`CountDownLatch`确保所有线程都准备好之后再开始执行:
43 |
44 | ```java
45 | CountDownLatch latch = new CountDownLatch(N);
46 | for (int i = 0; i < N; i++) {
47 | new Thread(() -> {
48 | // 准备工作...
49 | latch.countDown();
50 | try {
51 | latch.await(); // 等待所有线程准备完毕
52 | } catch (InterruptedException e) {
53 | Thread.currentThread().interrupt();
54 | }
55 | // 执行任务...
56 | }).start();
57 | }
58 | ```
59 |
60 | #### 异步编程优化
61 |
62 | 利用`CompletableFuture`可以实现异步编程,避免阻塞主线程,提高系统吞吐量。下面的例子展示了如何使用`CompletableFuture`异步执行任务并在结果可用时进行处理:
63 |
64 | ```java
65 | CompletableFuture.supplyAsync(() -> {
66 | // 耗时操作...
67 | return result;
68 | }).thenAccept(result -> {
69 | // 处理结果...
70 | });
71 | ```
72 |
73 | #### 并发集合的使用
74 |
75 | 使用并发集合如`ConcurrentHashMap`可以在多线程环境下安全地进行数据操作,而无需外部同步:
76 |
77 | ```java
78 | ConcurrentHashMap map = new ConcurrentHashMap<>();
79 | map.put("key", "value");
80 | ```
81 |
82 | ### 结论
83 |
84 | 通过合理运用JUC提供的工具,我们可以显著提升业务功能的并发处理能力,减少资源消耗,并简化多线程编程的复杂性。无论是线程池管理、线程同步控制,还是异步编程和并发数据结构,JUC为我们提供了一套全面的解决方案。然而,值得注意的是,虽然JUC提供了很多便捷的工具,但正确使用它们要求开发者理解并发编程的原理和细节。错误的使用方法可能会导致难以发现的并发问题。因此,在使用JUC进行系统性能优化时,建议仔细测试和审查代码。
--------------------------------------------------------------------------------
/docs/md/12306/分布式锁在项目设计中的应用.md:
--------------------------------------------------------------------------------
1 | # **分布式锁在项目设计中的应用**
2 |
3 | ## 分布式锁简介
4 | 分布式锁是一种在分布式系统中用于协调多个进程或服务之间共享资源访问的同步机制。在项目设计中,分布式锁的应用非常关键,尤其是在需要确保多个节点上的操作的原子性、一致性和排他性时。
5 |
6 | ### 分布式锁在项目设计中的几种典型应用场景:
7 |
8 | - 1. 数据库操作的同步
9 | 在分布式系统中,多个服务可能需要访问和修改同一份数据库资源。为了防止数据不一致和并发问题,可以使用分布式锁来确保同一时间只有一个服务能够执行特定的数据库操作。
10 | - 2. 缓存更新的同步
11 | 分布式系统中的缓存更新操作需要保证原子性,以防止缓存数据不一致。例如,当一个服务更新缓存时,可以使用分布式锁来阻止其他服务同时对相同的缓存键进行操作。
12 | - 3. 任务的串行执行
13 | 在处理一些需要串行执行的任务时,分布式锁可以确保任务在分布式环境下按照预定的顺序执行。例如,定时任务、批处理作业等,可以通过分布式锁来控制任务的启动和执行。
14 | - 4. 资源的独占访问
15 | 在分布式系统中,某些资源(如文件、网络连接等)可能需要独占访问。分布式锁可以用来确保在任何给定时间,只有一个服务能够访问这些资源。
16 | - 5. 限流和节流
17 | 分布式锁可以用于实现分布式环境下的限流和节流策略。例如,通过限制同时访问某个服务的请求数量,可以防止系统过载。
18 | - 6. 领导选举
19 | 在分布式系统中,领导选举算法(如Raft或ZooKeeper的Leader Election)通常会用到分布式锁来确保集群中的一个节点成为领导者,并对系统状态进行协调。
20 |
21 | ### 实现分布式锁的技术
22 | 实现分布式锁的技术有多种,包括但不限于:
23 |
24 | - 基于数据库:使用数据库事务和唯一索引来实现锁。
25 | - 基于缓存系统:使用Redis的SETNX(SET if Not eXists)命令或Redisson等库来实现锁。
26 | - 基于分布式协调服务:使用ZooKeeper、etcd等分布式协调服务来实现锁。
27 | - 基于消息队列:使用消息队列的顺序消息特性来实现分布式锁。
28 |
29 | ## 设计考虑
30 | 在使用分布式锁时,需要考虑以下几个设计要点:
31 |
32 | - 性能:锁的获取和释放需要高效,以免成为系统瓶颈。
33 | - 可靠性:锁的实现必须可靠,确保在分布式环境下的一致性和可用性。
34 | - 死锁处理:需要有机制来处理死锁情况,例如通过设置锁的超时时间。
35 | - 容错性:在分布式锁的实现中,需要考虑节点故障和网络分区的情况。
36 | - 可扩展性:随着系统规模的扩大,分布式锁的实现应当能够适应更多的并发访问。、
37 |
38 | ## 分布式锁在项目中的实现和应用
39 | // todo
40 |
41 | ## 总结
42 |
43 | 综上所述,分布式锁在项目设计中扮演着关键角色,它有助于确保分布式环境下的数据一致性和操作的原子性。在设计和实现分布式锁时,需要权衡多种因素,选择最适合项目需求的技术方案。
--------------------------------------------------------------------------------
/docs/md/12306/如何生成分布式ID.md:
--------------------------------------------------------------------------------
1 | # **如何生成分布式ID**
2 | 随着12306开源项目的不断发展,后端服务需要处理来自全国乃至全球的海量请求。在这样的分布式系统中,生成全局唯一且高效的ID是保障数据一致性和服务可靠性的关键。以下是针对12306开源项目的分布式ID选型分析与实践。
3 |
4 | ## **项目需求分析**
5 |
6 | 首先,我们需要明确12306项目对分布式ID的基本要求:
7 | - **全局唯一性**:确保每个交易、订单或记录都有一个独一无二的标识符。
8 | - **高并发支持**:系统需能够支撑极高的并发请求,特别是在购票高峰期。
9 | - **可排序性**:ID最好能反映时间信息,便于数据库索引和数据分片。
10 | - **易扩展性**:随着业务的增长,ID生成系统应易于水平扩展。
11 | - **兼容性**:ID生成方案不应依赖于特定的技术栈或存储系统。
12 |
13 | ## **可选方案对比**
14 |
15 | 基于以上需求,我们评估了几种常见的分布式ID生成策略:
16 |
17 | - **UUID**:虽然UUID可以保证全局唯一性和高并发性能,但其长度过长且无法排序,不适合作为数据库主键,因此被排除。
18 |
19 | - **数据库自增ID**:这种方法实现简单,但显然不适合分布式环境,因为多个节点间难以协调,容易产生冲突。
20 |
21 | - **雪花算法(Snowflake)**:Twitter的雪花算法在分布式系统中得到了广泛应用。它生成的ID有序且高效,但依赖于系统时钟,并且当单个数据中心内的节点数量超过最大序列号时,需要进行微调。
22 |
23 | - **Leaf**:美团点评开源的Leaf提供了高度的灵活性和可扩展性,支持自定义比特位分配,适合大型分布式系统。
24 |
25 | ## **选型决策**
26 |
27 | 综合考虑项目的具体需求和各方案的优缺点,我们决定在12306开源项目中采用改进型的雪花算法或Leaf作为分布式ID的生成策略。
28 |
29 | ### **实施细节**
30 |
31 | - **时间戳精度**:考虑到票务系统的特点,我们可以将时间戳的精度从毫秒级调整到秒级,以减少ID冲突的可能性。
32 |
33 | - **数据中心和机器ID分配**:根据12306的服务器部署情况,合理规划数据中心和机器ID的分配,确保ID的唯一性和高效生成。
34 |
35 | - **序列号设计**:为了避免同一毫秒内生成的ID冲突,序列号的范围应该足够大,同时考虑未来可能的水平扩展需求。
36 |
37 | - **容错机制**:建立监控和报警机制,确保在系统时钟不同步或其他异常情况下,ID生成服务仍能正常工作。
38 |
39 | - **测试验证**:在实际投入使用前,进行充分的性能测试和压力测试,确保在不同的负载条件下ID生成系统的稳定性和可靠性。
40 |
41 | ## **结语**
42 |
43 | 通过精心的设计和选型,12306开源项目的分布式ID生成方案将为整个系统的稳定运行提供坚实的基础。无论是日常运营还是高峰时段的压力,一个可靠的ID生成策略都是保障数据完整性和服务可用性的关键。随着项目的不断进化,我们也将持续优化ID生成方案,以满足业务的持续发展需求。
44 |
45 |
--------------------------------------------------------------------------------
/docs/md/12306/死磕设计模式之抽象策略模式.md:
--------------------------------------------------------------------------------
1 | # **死磕设计模式之抽象策略模式**
--------------------------------------------------------------------------------
/docs/md/12306/环境搭建.md:
--------------------------------------------------------------------------------
1 | # **运行环境搭建指南**
2 |
3 | 随着12306项目的开源,越来越多的开发者和企业有机会研究、使用乃至改进这一国民级应用。
4 | 本文旨在提供一份详细的运行环境搭建指南,帮助开发者快速搭建起12306开源项目的本地开发和测试环境。
5 |
6 | ## **一、系统要求**
7 |
8 | 在开始之前,请确保你的系统满足以下要求:
9 | - 操作系统:推荐使用Linux(如Ubuntu 18.04 LTS或更高版本),也可以使用Windows 10或更高版本,macOS Catalina或更高版本。
10 | - 内存:至少4GB RAM,推荐8GB或以上。
11 | - 存储空间:至少20GB的可用硬盘空间。
12 | - 网络:稳定的网络连接以便下载必要的软件包和依赖。
13 |
14 | ## **二、开发环境准备**
15 |
16 | 以下是搭建开发环境的基本步骤:
17 |
18 | 1. **安装Docker**
19 | - Docker是用于自动部署应用程序的开源平台,可以方便地创建和管理容器。
20 | - 根据你使用的操作系统,从Docker官网下载并安装适合的Docker版本。
21 |
22 | 2. **安装Docker Compose**
23 | - Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。
24 | - 使用以下命令安装Docker Compose:
25 | ```
26 | sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
27 | sudo chmod +x /usr/local/bin/docker-compose
28 | ```
29 |
30 | 3. **安装Git**
31 | - Git是一个分布式版本控制系统,用于源代码管理。
32 | - 根据操作系统的指令完成Git的安装。
33 |
34 | 4. **克隆12306项目代码仓库**
35 | - 使用以下命令将12306项目的代码仓库克隆到本地:
36 | ```
37 | git https://gitee.com/Ken2024888/12306.git
38 | cd 12306
39 | ```
40 |
41 | 5. **配置环境变量**
42 | - 根据项目文档,设置必要的环境变量,这些变量可能包括数据库地址、端口号、API密钥等。
43 |
44 | ## **三、启动项目**
45 |
46 | 在确保所有依赖和环境变量配置正确后,可以使用以下命令启动项目:
47 |
48 | 1. **构建Docker镜像**
49 | ```
50 | docker-compose build
51 | ```
52 |
53 | 2. **启动Docker容器**
54 | ```
55 | docker-compose up -d
56 | ```
57 |
58 | 此时,所有的服务将以容器的形式在后台运行。如果需要停止服务,可以使用`docker-compose down`命令。
59 |
60 | ## **四、验证安装**
61 |
62 | 要验证项目是否成功运行,可以在浏览器中访问项目的Web界面(通常是`http://localhost:端口号`),或通过API接口发送请求并检查响应。
63 |
64 | ## **五、常见错误处理**
65 |
66 | 在环境搭建过程中可能会遇到一些常见问题,如端口冲突、权限不足等。这时应检查日志文件和系统消息,根据具体错误信息进行调整和修复。
67 |
68 | ## **结语**
69 |
70 | 以上步骤为12306开源项目运行环境的搭建提供了基本指导。请注意,实际项目中可能需要根据具体情况调整配置和步骤。搭建完成后,你可以自由地进行代码开发、功能测试和性能优化等工作。祝你在12306开源项目的探索和学习之旅中收获满满!
71 |
--------------------------------------------------------------------------------
/docs/md/12306/详解雪花算法.md:
--------------------------------------------------------------------------------
1 | # 详解雪花算法
2 |
3 | ### 外置Snowflake
4 |
5 | 雪花算法Snowflake,Twitter公司分布式项目采用的ID生成算法。
6 |
7 | 
8 |
9 | 这个算法生成的ID是一个64位的长整型long:
10 |
11 | - 1位符号位,值为 0,没有实际意义,主要为兼容长整型的格式
12 | - 41位时间戳,记录本地的毫秒时间。41 位的时间戳可以容纳的毫秒数是 2 的 41 次幂,一年所使用的毫秒数是365 * 24 * 60 * 60 * 1000,即 69.73 年。即ShardingSphere 的 SnowFlake 算法的时间纪元从 2016 年 11 月 1 日零点开始,可以使用到 2086 年
13 | - 10 bit工作进程位,机器ID,机器就是生成ID的节点,用10位长度给机器做编码,那意味着最大规模可以达到1024个节点(2^10)。前 5 个 bit 代表机房 id,后 5 个 bit 代表机器i
14 | - 12位序列号,某个机房某台机器上在一毫秒内同时生成的 ID 序号。如果在这个毫秒内生成的数量超过 4096(即 2 的 12 次幂),那么生成器会等待下个毫秒继续生成。序列的长度直接决定了一个节点1毫秒能够产生的ID数量,12位就是4096(2^12)
15 |
16 | 据数据结构推算:
17 |
18 | - 每秒可以产生 26 万个自增可排序的 ID
19 | - 支持TPS可达(2^22*1000,419万左右),够绝大多数系统。
20 |
21 | 但实现雪花算法时,注意时间回拨影响。机器时钟若回拨,产生的ID就可能重复,需在算法中特殊处理。
22 |
23 | SnowFlake 算法依赖时间戳,需考虑时钟回拨,即服务器因时间同步,导致某部分机器的时钟回到了过去的时间点。时间戳的回滚肯定会导致生成一个已使用过的ID,因此默认分布式主键生成器提供一个最大容忍的时钟回拨ms数:
24 |
25 | - 若时钟回拨时间超过最大容忍的毫秒数阈值,则程序报错
26 | - 在可容忍范围内,默认分布式主键生成器会等待时钟同步到最后一次主键生成的时间后,再继续工作
--------------------------------------------------------------------------------
/docs/md/AI/01-RAG应用框架和解析器.md:
--------------------------------------------------------------------------------
1 | # 01-RAG应用框架和解析器
2 |
3 | ## 1 开源解析和拆分文档
4 |
5 | 第三方工具去对文件解析拆分,将文件内容给提取出来,并将我们的文档内容去拆分成一个小的chunk。
6 |
7 | 常见的PDF、word、markdown、JSON、HTML,都有很好的模块去把这些文件去进行一个东西去提取。
8 |
9 | ### 1.1 优势
10 |
11 | - 支持丰富的文档类型
12 | - 每种文档多样化选择
13 | - 与开源框架无缝集成
14 |
15 |
16 |
17 | 
18 |
19 | 但有时效果很差,内容跟原始文件内容差别大。
20 |
21 | ## 2 PDF格式多样性
22 |
23 |
24 |
25 | 
26 |
27 | **复杂多变的文档格式,提高解析效果十分困难**。
28 |
29 | ## 3 复杂文档格式解析问题
30 |
31 | 文档内容质量将很大程度影响最终效果,文档处理过程涉及问题:
32 |
33 | ### 3.1 内容不完整
34 |
35 | 对文档的内容提取时,可能发现提取出的文档内容会被截断。跨页形式,提取出来它的上下页,两部分内容就会被截断,导致文档内部分内容丢失,去解析图片或双栏复杂的这种格式,它会有一部分内容丢失。
36 |
37 | ### 3.2 内容错误
38 |
39 | 同一页PDF文件可能存在文本、表格、图片等混合。
40 |
41 | PDF解析过程中,同一页它不同段落其实会也会有不同标准的一些格式。按通用格式去提取解析就遇到同页不同段落格式不标准情况。
42 |
43 | ### 3.3 文档格式
44 |
45 | 像常见PDF md文件,需要去支持把这些各类型的文档格式的文件都给提取。
46 |
47 | ### 3,4 边界场景
48 |
49 | 代码块还有单元格这些,都是我们去解析一个复杂文档格式中会遇到的一些问题。
50 |
51 | ## 4 PDF内容提取流程
52 |
53 |
54 |
55 | 
56 |
57 | ## 5 为啥解析文档后,要做知识片段拆分?
58 |
59 | ### 5.1 Token限制
60 |
61 | - 绝大部分开源限制 <= 512 Tokens
62 | - bge_base、e5_large、m3e_base、text2vector_large_chinese、multilingnal-e5-base..
63 |
64 | ### 5.2 效果影响
65 |
66 | - 召回效果:有限向量维度下表达较多的文档信息易产生失真
67 | - 回答效果:召回内容中包含与问题无关信息对LLM增加干扰
68 |
69 | ### 5.3 成本控制
70 |
71 | - LLM费用:按Token计费
72 | - 网络费用:按流量计费
73 |
74 | ## 6 Chunk(块)拆分对最终效果的影响
75 |
76 | ### 6.1 Chunk太长
77 |
78 | 信息压缩失真。
79 |
80 | ### 6.2 Chunk太短
81 |
82 | 表达缺失上下文;匹配分数容易变高。
83 |
84 | ### 6.3 Chunk跨主题
85 |
86 | 内容关系脱节。
87 |
88 | ### 原文连续内容(含表格)被截断
89 |
90 | 单个Chunk信息表达不完整,或含义相反
91 |
92 | ### 干扰信息
93 |
94 | 如空白、HTML、XML等格式,同等长度下减少有效信息、增加干扰信息
95 |
96 | ### 主题和关系丢失
97 |
98 | 缺失了主题和知识点之间的关系
99 |
100 | ## 7 改进知识的拆分方案
101 |
102 |
103 |
104 | 
105 |
106 | ## 8 商用向量数据库AI套件
107 |
108 | 云厂商:
109 |
110 | 
--------------------------------------------------------------------------------
/docs/md/AI/04-prompt-helping-llm-understand-knowledge.md:
--------------------------------------------------------------------------------
1 | # 04-prompt-helping-llm-understand-knowledge
2 |
3 | ## 1 Prompt
4 |
5 | Prompt 可理解为指导AI模型生成特定类型、主题或格式内容的文本。
6 |
7 | NLP中,Prompt 通常由一个问题或任务描述组成,如“给我写一篇有关RAG的文章”,这句话就是Prompt。
8 |
9 | Prompt赋予LLM小样本甚至零样本学习的能力:
10 |
11 | 
12 |
13 | LLM能力本质上说是续写,通过编写更好的prompt来指导模型,并因此获得更好的结果:
14 |
15 | 
16 |
17 | 无具体指令,模型只会续写。输出结果可能出人意料或远高于任务要求:
18 |
19 | 
20 |
21 | 告知模型去完善句子,因此输出结果和最初输入完全符合。Prompt Engineering就是探讨如何设计最佳Prompt,用于指导LLM高效完成某项任务。
22 |
23 | ## 2 Prompt的进阶技巧CoT
24 |
25 | Chain of Thought,让模型输出更多的上下文与思考过程,提升模型输出下一个token的准确率。
26 |
27 | 
28 |
29 | ## 3 优化Prompt,提升模型推理能力和问答准确率
30 |
31 | ### 3.1 分布式引导提问
32 |
33 | 把解决问题的思路分成多步,引导模型分步执行
34 |
35 | 
36 |
37 | ### 3.2 Prompt代码化
38 |
39 | LLM通常都会有代码数据,prompt代码化进一步提升模型的推理能力。
40 |
41 | 
42 |
43 | 
--------------------------------------------------------------------------------
/docs/md/AI/13-best-development-practices.md:
--------------------------------------------------------------------------------
1 | # 13-最佳开发实践
2 |
3 | ## 1 LangChain 的定位
4 |
5 |
6 |
7 | 
8 |
9 | - 【代码层】LangChain-Core: LCEL
10 | - 【代码层】LangChain-Community 社区贡献
11 | - 【代码层】LangChain 封装组件
12 | - 一站式开发平台 LangSmith
13 | - 便捷AI应用服务器部署套件LangServe
14 |
15 | ## 2 大模型选型
16 |
17 | 考虑模型、agent、prompt、chain评估:
18 |
19 | 
20 |
21 | ### 2.1 闭源大模型+API
22 |
23 | - 优点:省事、强大
24 | - 缺点:成本、限速、数据隐私
25 |
26 | ### 2.2 开源大模型+自托管
27 |
28 | 优点:数据私有、更灵活、成本低
29 |
30 | 缺点:算力设施、技术支撑
--------------------------------------------------------------------------------
/docs/md/AI/AI大模型企业应用实战.md:
--------------------------------------------------------------------------------
1 | # AI 大模型企业应用实战
2 |
3 | ## 你将获得
4 |
5 | - gpt/qwen API 编程要点 + LangChain 使用技巧
6 | - 基于 LLM 的代码生成与调试实践
7 | - LLM 在研发全过程的应用案例
8 | - LLM 的云原生部署任务实践
9 | - 企业应用引入 LLM 的排坑指南
10 |
11 | ## 专栏介绍
12 |
13 | 现在以 GPT/qwen 为代表的大语言模型广受关注,许多企业都在积极探索在自身领域落地 AIGC 技术。
14 |
15 | 虽然大模型在辅助文档编写、问题回答、内容总结等特定的日常任务上表现良好,但想要把 GPT 这类自然语言模型真正应用到企业应用开发,提高系统的智能化和自动化,我们仍然面临着许多挑战。
16 |
17 | - LLM 基于历史数据训练,处理最新信息相关查询的能力有限。
18 | - 与环境的交互问题处理难度大,比如通过 LLM 执行 shell 命令或调用 API 等任务,都涉及到对系统外部环境的联动。
19 | - LLM 需要结合企业内部数据训练调优,才能保障生成内容的准确性。
20 | - LLM 的代码生成能力虽然很强大,但往往针对通用功能,无法处理企业里更复杂的需求。
21 |
22 | 为了帮你解决这些问题,根据我在云原生平台中集成大模型的实操经验,带你沉浸式体验如何把 LLM 应用到企业应用开发的整体流程中。
23 |
24 | 实践是检验真理的唯一标准,而可以执行的代码是掌握理论的最佳路径。因此专栏以具体场景的代码实战演练与调试为主,使用 Python 作为编程语言。
25 |
26 | 配套代码你可以从这里获取:https://github.com/Java-Edge/AIAgent
27 |
28 | **专栏设计**
29 |
30 | 基础篇、企业应用篇和研发效率篇三个章节,带你循序渐进掌握 LLM 的应用落地。
31 |
32 | 
33 |
34 | **基础篇**
35 | 带你快速熟悉 LLM 的基本用法与应用技巧。我们会一起构建开发环境和运行环境,运行第一个大语言模型程序,学习相关提示词技巧,认识 LangChain,并给聊天机器人注入记忆。
36 |
37 | **企业应用篇**
38 | 结合大量例子,带你应对企业应用融入 LLM 时面临的诸多挑战,包括与现有企业内部数据的整合、与其他程序的整合、LLM 生成部分与外部环境交互等问题。学完这一章,你就能综合应用大模型和其他工具解决实际工程问题,并结合具体需求场景定制自己的 AutoGPT。
39 |
40 | **研发效率篇**
41 | 结合之前所学,探索如何将 LLM 应用到整个研发生命周期里,有效提升我们的工作效率和质量。这一章不但会为你演示 LLM 在系统设计、代码生成、测试生成、云原生部署等方面的应用方法与调优思路,还会与你探讨如何调整现有的架构思维和研发方式,更充分地发掘大模型价值。
42 |
43 | ## 适合人群
44 |
45 | 1. 希望在企业应用中落地大语言模型,并借此提升团队研发效率的软件工程师和架构师。
46 | 2. 初中级开发者可以学到如何通过编程方式使用大模型,提高自身开发效率。
47 | 3. 高级软件开发者和架构师,可以获得对未来软件的新思考,了解大模型带来的软件架构变革和基于大语言模型的全新开发范式。
48 | 4. 需要了解一门编程语言,后续专栏里会使用 Python 语言做演示。
49 |
50 | ## 专栏目录
51 |
52 | 
--------------------------------------------------------------------------------
/docs/md/AI/agent/boost-ai-workflow-resilience-with-error-handling.md:
--------------------------------------------------------------------------------
1 | # v0.14.0:告别 AI 应用崩溃,构建更可靠的智能工作流!
2 |
3 | ## 0 前言
4 |
5 | 使用 Dify 构建AI应用程序,需要处理复杂的工作流程,其中单个组件(节点)可能会遇到 API 超时或 LLM 输出异常等问题。以前,单个节点故障就可能扰乱整个工作流程。
6 |
7 | Dify引入强大的[错误处理功能 ](https://docs.dify.ai/guides/workflow/error-handling),以防级联故障:
8 |
9 | - 不仅可捕获异常以维护工作流的执行
10 | - 还允许开发人员为四种关键节点类型定义自定义错误处理
11 |
12 | 实现详细的调试并确保弹性
13 |
14 | ## 1 为啥错误处理很重要?
15 |
16 | 考虑文档处理工作流:
17 |
18 | 1. 文本从PDF提取
19 | 2. LLM分析该文本并生成结构化数据
20 | 3. 代码处理这些数据,完善文本
21 | 4. 输出精炼文本
22 |
23 | 若无错误处理,LLM生成格式错误的数据或代码节点遇到错误都导致工作流程停止。Dify现提供以下解决方案:
24 |
25 | - **默认值:** 预定义输出值,允许下游节点即使在输入缺失、不正确或格式错误的情况下也能继续运行
26 | - **工作流重定向:** 异常时,工作流重定向到备用分支,用 `error_type` 、 `error_message` 变量捕获错误详细信息并启用后续操作,如通知或备份工具激活
27 |
28 | 并行工作流中,单个分支故障以往导致整个流程停止。现在,这些错误处理策略允许其他分支继续运行,显著提高可靠性:
29 |
30 | 
31 |
32 | ## 2 具有错误处理的关键节点
33 |
34 | Dify高级错误处理针对四种易出错的节点类型:
35 |
36 | 1. **LLM 节点:** 处理无效响应、API 问题和速率限制。开发者可设置默认输出或使用条件分支来获取替代解决方案
37 | 2. **HTTP 节点:** 在保持工作流执行的同时,通过重试间隔和详细的错误消息解决 HTTP 错误(404、500、超时)
38 | 3. **工具节点:** 如果主工具出现故障,可以快速切换到备用工具
39 | 4. **代码节点:** 使用预定义值或替代逻辑分支管理运行时错误,记录错误详细信息以防止中断
40 |
41 | ## 3 错误处理实例
42 |
43 | 与外部 API 交互的工作流。为模拟各种 HTTP 状态代码,用 [httpstat.us](http://httpstat.us/) 服务:
44 |
45 | 
46 |
47 | 1. 起始节点启动工作流
48 | 2. HTTP请求节点调用 [httpstat.us](http://httpstat.us/)
49 | 3. 失败分支处理错误
50 | 4. 条件逻辑(Conditional logic)响应特定错误码:
51 | - 403(禁止):显示权限消息
52 | - 404(未找到):记录“未找到资源”消息
53 | - 429(请求过多):建议稍后重试
54 | - 500(服务器错误):切换到备份服务或触发警报
55 | 5. 输出节点,生成适当的响应
56 |
57 | 通过确保工作流程的稳定性并提供有价值的错误反馈,这种设计增强了业务运营的可靠性。
58 |
59 | ## 4 使用Dify构建更可靠AI工作流
60 |
61 | Dify v0.14.0 增强的错误管理功能,提供更强大的控制力和灵活性,实现稳健工作流,妥善处理异常并防止中断,确保 AI 应用程序的可靠性。
--------------------------------------------------------------------------------
/docs/md/AI/agent/dify-v1-1-0-filtering-knowledge-retrieval-with-customized-metadata.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Java-Edge/Java-Interview-Tutorial/7ff45781c88c1074a97b1351c8da8afc98b3bcfb/docs/md/AI/agent/dify-v1-1-0-filtering-knowledge-retrieval-with-customized-metadata.md
--------------------------------------------------------------------------------
/docs/md/AI/agent/perplexity-labs.md:
--------------------------------------------------------------------------------
1 | # 不止于搜索!Perplexity Labs深度解析:以项目为核心的 AI 工作流!
2 |
3 | ## 0 前言
4 |
5 | Perplexity推出全新功能 [Labs](https://www.perplexity.ai/pl/hub/blog/introducing-perplexity-labs),专为 Pro 订阅用户设计,旨在支持更复杂的任务,功能超越了传统的问答服务。这一重大更新标志着 Perplexity 从以搜索为核心的交互模式,转向由生成式 AI 驱动的结构化、多步骤工作流。
6 |
7 | ## 1 交互模式
8 |
9 | Perplexity Labs 让用户可在一个统一界面完成多种任务,包括生成报告、分析数据、编写和执行代码、构建轻量级网页应用等。用户可以通网页和移动端的新模式切换器进入 Labs,桌面端支持也即将上线。
10 |
11 | ## 2 适用场景
12 |
13 | 与专注于简洁回答的 Perplexity Search 和提供深入信息整合的 Research(原名 Deep Research)不同,Labs 更适合需要完整成果输出的用户。这些成果可能包括格式化的电子表格、可视化图表、交互式仪表盘和基础网页工具等。
14 |
15 | 每个 Lab 项目都包含一个“Assets”标签页,用户可在此查看或下载所有生成的素材,如图表、图片、CSV 文件和代码文件。有些 Labs 还支持“App”标签页,可以直接在项目环境中渲染基本网页应用。
16 |
17 | ## 3 使用反馈
18 |
19 | Perplexity 的 CEO 和联合创始人 Aravind Srinivas 表示:
20 |
21 | > 推出 Perplexity Labs,是我们在 Perplexity 上进行搜索的一种全新方式,支持更复杂的任务,如构建交易策略、仪表盘、用于房地产研究的无头浏览任务、迷你网页应用、故事板,以及生成素材的目录等。
22 |
23 | 实际使用看,Labs 实现了多个软件工具功能的整合与自动化,大大减少了手动操作,尤其适用于结构化研究、数据处理或原型开发等场景。
24 |
25 | 用户反馈也显示出平台在速度和语境理解方面的优势。Sundararajan Anandan 就曾[分享](https://www.linkedin.com/feed/update/urn:li:ugcPost:7333908730314399752?commentUrn=urn%3Ali%3Acomment%3A(ugcPost%3A7333908730314399752%2C7334912579871326209)&dashCommentUrn=urn%3Ali%3Afsd_comment%3A(7334912579871326209%2Curn%3Ali%3AugcPost%3A7333908730314399752)):
26 |
27 | > 我最近尝试了 Perplexity Labs,它真的改变了游戏规则。以前需要花几个小时才能完成的手动研究和格式整理,现在在 10 分钟内就能输出清晰、可执行的见解。虽然目前还处于早期阶段,平台也有待进一步完善,但初次体验已经相当令人惊艳。
28 |
29 | 不过,一些早期用户也指出了可改进的地方,特别是在初次生成后进行跟进操作或修改代码方面功能有限。正如一位 Reddit 用户[评论](https://www.reddit.com/r/perplexity_ai/comments/1kza7vo/comment/mv6koy5/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button)所说:
30 |
31 | > Labs 最大的问题在于它对后续操作的支持不够,基本要求用户一击命中,非常考验技巧。
32 |
33 | ## 4 总结
34 |
35 | Perplexity 还宣布将统一产品术语,将“Deep Research”简化为“Research”,以便更清晰地区分三种模式:Search、Research 和 Labs。
36 |
37 | 目前,Perplexity Labs 已正式上线,向所有 Pro 用户开放。平台还提供了 [Projects Gallery](https://www.perplexity.ai/labs),展示了各种示例和使用案例,帮助用户快速上手完成实际任务。
--------------------------------------------------------------------------------
/docs/md/AI/document-parsing-and-chunking-in-open-source-tools.md:
--------------------------------------------------------------------------------
1 | # 01-RAG应用框架和解析器
2 |
3 | ## 1 开源解析和拆分文档
4 |
5 | 第三方工具去对文件解析拆分,提取文件内容,并将文档内容拆分成一个小chunk。
6 |
7 | PDF、word、markdown、JSON、HTML等都有很好的模块执行提取。
8 |
9 | ### 1.1 优势
10 |
11 | - 支持丰富的文档类型
12 | - 每种文档多样化选择
13 | - 与开源框架无缝集成
14 |
15 | 
16 |
17 | 但有时效果很差,内容跟原文件差别大。
18 |
19 | ## 2 PDF格式多样性
20 |
21 | 
22 |
23 | 复杂多变的文档格式,提高解析效果困难。
24 |
25 | ## 3 复杂文档格式解析问题
26 |
27 | 文档内容质量很大程度影响最终效果,文档处理涉及问题:
28 |
29 | ### 3.1 内容不完整
30 |
31 | 对文档的内容提取时,可能发现提取出的文档内容会被截断。跨页形式,提取出来它的上下页,两部分内容就会被截断,导致文档内部分内容丢失,去解析图片或双栏复杂的这种格式,它会有一部分内容丢失。
32 |
33 | ### 3.2 内容错误
34 |
35 | 同一页PDF文件可能存在文本、表格、图片等混合。
36 |
37 | PDF解析过程中,同一页它不同段落其实会也会有不同标准的一些格式。按通用格式去提取解析就遇到同页不同段落格式不标准情况。
38 |
39 | ### 3.3 文档格式
40 |
41 | 像常见PDF md文件,需要去支持把这些各类型的文档格式的文件都给提取。
42 |
43 | ### 3,4 边界场景
44 |
45 | 代码块还有单元格这些,都是我们去解析一个复杂文档格式中会遇到的一些问题。
46 |
47 | ## 4 PDF内容提取流程
48 |
49 | 
50 |
51 | ## 5 为啥解析文档后,要做知识片段拆分?
52 |
53 | ### 5.1 Token限制
54 |
55 | - 绝大部分开源限制 <= 512 Tokens
56 | - bge_base、e5_large、m3e_base、text2vector_large_chinese、multilingnal-e5-base..
57 |
58 | ### 5.2 效果影响
59 |
60 | - 召回效果:有限向量维度下表达较多的文档信息易产生失真
61 | - 回答效果:召回内容中包含与问题无关信息对LLM增加干扰
62 |
63 | ### 5.3 成本控制
64 |
65 | - LLM费用:按Token计费
66 | - 网络费用:按流量计费
67 |
68 | ## 6 Chunk拆分对最终效果的影响
69 |
70 | ### 6.1 Chunk太长
71 |
72 | 信息压缩失真。
73 |
74 | ### 6.2 Chunk太短
75 |
76 | 表达缺失上下文;匹配分数容易变高。
77 |
78 | ### 6.3 Chunk跨主题
79 |
80 | 内容关系脱节。
81 |
82 | ### 原文连续内容(含表格)被截断
83 |
84 | 单个Chunk信息表达不完整,或含义相反
85 |
86 | ### 干扰信息
87 |
88 | 如空白、HTML、XML等格式,同等长度下减少有效信息、增加干扰信息
89 |
90 | ### 主题和关系丢失
91 |
92 | 缺失了主题和知识点之间的关系
93 |
94 | ## 7 改进知识的拆分方案
95 |
96 | 
97 |
98 | ## 8 商用向量数据库AI套件
99 |
100 | Vector DB AI套件:
101 |
102 | 
--------------------------------------------------------------------------------
/docs/md/AI/langchain4j/customizable-http-client.md:
--------------------------------------------------------------------------------
1 | # HTTP 客户端
2 |
3 | >LangChain4j HTTP 客户端定制:解锁 LLM API 交互的更多可能性
4 |
5 | ## 0 前言
6 |
7 | 一些 LangChain4j 模块(目前是 OpenAI 和 Ollama)支持自定义用于调用 LLM 提供程序 API 的 HTTP 客户端。
8 |
9 | `langchain4j-http-client` 模块实现了一个 `HttpClient` SPI,这些模块用它来调用 LLM 提供程序的 REST API。即底层 HTTP 客户端可自定义,并通过实现 `HttpClient` SPI 来集成任何其他 HTTP 客户端。
10 |
11 | ## 1 实现方案
12 |
13 | 目前,有两种开箱即用的实现:
14 |
15 | ### 1.1 JdkHttpClient
16 |
17 | `langchain4j-http-client-jdk` 模块中的 `JdkHttpClient` 。当使用受支持的模块(如 `langchain4j-open-ai` )时,默认使用它。
18 |
19 | ### 1.2 SpringRestClient
20 |
21 | `langchain4j-http-client-spring-restclient` 中的 `SpringRestClient` 。当使用受支持的模块的 Spring Boot 启动器(例如 `langchain4j-open-ai-spring-boot-starter` )时,默认使用它。
22 |
23 | ## 2 自定义JDK的HttpClient
24 |
25 | ```java
26 | HttpClient.Builder httpClientBuilder = HttpClient.newBuilder()
27 | .sslContext(...);
28 |
29 | JdkHttpClientBuilder jdkHttpClientBuilder = JdkHttpClient.builder()
30 | .httpClientBuilder(httpClientBuilder);
31 |
32 | OpenAiChatModel model = OpenAiChatModel.builder()
33 | .httpClientBuilder(jdkHttpClientBuilder)
34 | .apiKey(System.getenv("OPENAI_API_KEY"))
35 | .modelName("gpt-4o-mini")
36 | .build();
37 | ```
38 |
39 | ## 3 定制 Spring 的RestClient
40 |
41 | ```java
42 | RestClient.Builder restClientBuilder = RestClient.builder()
43 | .requestFactory(new HttpComponentsClientHttpRequestFactory());
44 |
45 | SpringRestClientBuilder springRestClientBuilder = SpringRestClient.builder()
46 | .restClientBuilder(restClientBuilder)
47 | .streamingRequestExecutor(new VirtualThreadTaskExecutor());
48 |
49 | OpenAiChatModel model = OpenAiChatModel.builder()
50 | .httpClientBuilder(springRestClientBuilder)
51 | .apiKey(System.getenv("OPENAI_API_KEY"))
52 | .modelName("gpt-4o-mini")
53 | .build();
54 | ```
--------------------------------------------------------------------------------
/docs/md/AI/langchain4j/observability.md:
--------------------------------------------------------------------------------
1 | # 10-可观测性
2 |
3 | ## LLM 可观测性
4 |
5 | [特定](/integrations/language-models) 的 `ChatLanguageModel` 和 `StreamingChatLanguageModel` 实现(请参见“可观测性”列)允许配置 `ChatModelListener`,用于监听以下事件:
6 |
7 | - 对 LLM 的请求
8 | - LLM 的响应
9 | - 错误
10 |
11 | 这些事件包含的属性包括[OpenTelemetry 生成 AI 语义约定](https://opentelemetry.io/docs/specs/semconv/gen-ai/)中的描述,例如:
12 |
13 | - 请求:
14 | - 模型
15 | - 温度(Temperature)
16 | - Top P
17 | - 最大 Tokens
18 | - 消息
19 | - 工具
20 | - 响应:
21 | - ID
22 | - 模型
23 | - Token 使用情况
24 | - 结束原因
25 | - AI 助手消息
26 |
27 | 以下是使用 `ChatModelListener` 的示例:
28 |
29 | ```java
30 | ChatModelListener listener = new ChatModelListener() {
31 |
32 | @Override
33 | public void onRequest(ChatModelRequestContext requestContext) {
34 | ChatModelRequest request = requestContext.request();
35 | Map