Skip to content

Commit 6fac543

Browse files
author
1020325258
committed
Merge branch 'main' of github.com:Java-Edge/Java-Interview-Tutorial
2 parents ef5e2e0 + 6acfdaf commit 6fac543

6 files changed

Lines changed: 199 additions & 12 deletions

File tree

248 KB
Loading
Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,44 @@
1-
# 如何生成分布式ID
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生成方案,以满足业务的持续发展需求。
244

docs/md/12306/环境搭建.md

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,70 @@
1-
# 环境搭建
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开源项目的探索和学习之旅中收获满满!

docs/md/12306/项目介绍.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# **12306开源项目介绍**
2+
3+
## **项目背景:**
4+
12306项目是一个关键的系统,与广大民众的生活和出行息息相关,它不仅包括列车时刻表查询、车票购买、订单管理、改签和退票、预约抢票、会员服务、支付管理、用户管理等多个方面,还涉及到了缓存、消息队列、分库分表等技术在背后支撑着整个系统的高效运行。
5+
6+
此外,12306的售票服务时间也有所调整,以更好地满足旅客的需求。同时,12306也是学习分布式系统设计的好案例,尤其适合对高并发、分布式系统感兴趣的学习者。通过研究12306项目的架构和技术实现,可以深入理解分布式系统设计的原则和核心知识点。
7+
8+
## **项目优势:**
9+
与其他开源项目相比,12306开源项目具有以下显著优势:
10+
11+
- **实战验证**:该项目基于实际运营的12306平台,已经过多年春运等极端场景的考验。
12+
- **高并发处理能力**:能够有效应对亿级用户的并发访问,保证系统稳定性。
13+
- **数据安全保障**:采用了先进的数据加密技术和安全防护措施,确保用户信息安全。
14+
- **用户体验优化**:持续根据用户反馈调整功能设计,提供极致的用户体验。
15+
16+
## **项目业务功能:**
17+
12306开源项目主要包括以下几大功能模块:
18+
19+
1. **车票预订**:包括车次查询、余票信息、座位选择、订单生成等。
20+
2. **支付结算**:集成多种支付方式,提供安全便捷的在线支付解决方案。
21+
3. **用户中心**:管理个人信息、订单历史、常用联系人等用户相关数据。
22+
4. **智能推荐**:根据用户行为和偏好,提供个性化的出行建议。
23+
24+
## **技术架构:**
25+
本项目采用了模块化的设计理念,构建了多层次的技术架构体系:
26+
27+
1. **前端展示层**:采用Vue.js/React等现代JavaScript框架,实现响应式Web界面。
28+
2. **业务逻辑层**:使用Spring Boot等后端框架处理业务逻辑,保障系统的灵活性和扩展性。
29+
3. **数据持久层**:结合MySQL、Redis等数据库技术,实现数据的高效存取和缓存策略。
30+
4. **分布式计算层**:利用Kubernetes等容器编排工具,实现服务的快速部署和自动伸缩。
31+
32+
## **技术栈:**
33+
### 后端技术栈:
34+
| 技术 | 名称 | 版本 | 网址 |
35+
|:--------------------------|:---------------:|---------------:|-------------------------------------------------|
36+
| Spring Boot | 基础框架 | 3.0.x | https://spring.io/projects/spring-boot |
37+
| SpringCloud Alibaba | 分布式框架 | 2022.0.0.0-RC2 | https://github.com/alibaba/spring-cloud-alibaba |
38+
| SpringCloud Gateway | 网关 | 2022.0.3 | https://spring.io/projects/spring-cloud-gateway |
39+
| MyBatis-Plus | 持久层框架 | 3.5.3.x | https://baomidou.com |
40+
| Redis | 分布式缓存数据库 | Latest | https://redis.io |
41+
| RocketMQ | 异步消息 | 2.2.x | https://rocketmq.apache.org |
42+
| ShardingSphere | 数据访问层框架 | 5.3.x | https://shardingsphere.apache.org |
43+
| FastJson2 | 序列化工具 | 2.0.36 | https://github.com/alibaba/fastjson2 |
44+
| Canal | BinLog 订阅组件 | 1.1.x | https://github.com/alibaba/canal |
45+
| HuTool | 工具包类库 | 5.8.x | https://hutool.cn |
46+
| Maven | 项目构建工具 | 3.9.x | http://maven.apache.org |
47+
| Redisson | Rediss客户端 | 3.21.3 | https://redisson.org |
48+
| Sentinel | 熔断限流框架 | 1.8.6 | https://github.com/alibaba/Sentinel |
49+
| XXL-Job | 分布式调度平台 | 2.4.0 | http://www.xuxueli.com/xxl-job |
50+
| TTL | 增强版 ThreadLocal | 2.14.3 | https://github.com/alibaba/transmittable-thread-local|
51+
| Hippo4j | 动态线程池框架 | 1.5.0 | https://hippo4j.cn |
52+
53+
### 前端技术栈:
54+
55+
| 技术 | 名称 | 版本 | 网址 |
56+
|-------|-----------|-------|---|
57+
| JS 框架 | Vuejs | 3.2.x | https://cn.vuejs.org |
58+
| UI 组件 | Element-UI | 2.13 | https://element.eleme.io/2.13/ |
59+
| Ajax 请求 | Axios | 1.4.0 | https://axios-http.com/ |
60+
| 路由 | Vue-router | 4.0.3 | https://router.vuejs.org/ |
61+
| 脚手架 | Vue-cli| 5.0.8 | https://cli.vuejs.org/|
62+
63+
## 项目文档
64+
![这是图片](/images/12306/12306项目文档.png "Magic Gardens")
65+
66+
## **常见问题:**
67+
1. **Q**: 项目如何处理高并发情况下的性能瓶颈?
68+
**A**: 通过分布式架构设计、负载均衡、数据库读写分离等技术手段确保系统稳定运行。
69+
70+
2. **Q**: 项目在数据安全方面有哪些措施?
71+
**A**: 实施SSL加密传输、XSS防护、CSRF防护等多层安全机制保护用户数据。
72+
73+
3. **Q**: 如何参与到12306开源项目的代码贡献中?
74+
**A**: 可以通过GitHub等代码托管平台提交Pull Request,参与到代码的编写和审查中。

docs/md/bigdata/01-macOS下 Hive 2.x 的安装与配置.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 01-macOS下 Hive 2.x 的安装与配置
22

3-
# 1 简介
3+
## 1 简介
44

55
基于Hadoop的一个数据仓库工具,可将结构化数据文件映射为一张数据库表,并提供简单[SQL]查询,可将SQL语句转换为MapReduce任务进行运行。
66

@@ -197,10 +197,12 @@ FLUSH PRIVILEGES;
197197
将下好的包解压
198198

199199
解压后,将此文件夹下mysql-connector-java-8.0.15.jar
200-
![](https://upload-images.jianshu.io/upload_images/16782311-fbd0d44ece0a36b5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
200+
201+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/20240310185522954.png)
201202

202203
复制到../hive/lib:
203-
![image.png](https://upload-images.jianshu.io/upload_images/16782311-9336f9b6da0dbb5e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
204+
205+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/20240310185603573.png)
204206

205207
需要给/tmp文件夹设置写权限,同时确保 hadoop不在安全模式下,可以执行此命令使hadoop退出安全模式:hadoop dfsadmin -safemode leave
206208

@@ -216,7 +218,7 @@ FLUSH PRIVILEGES;
216218
schematool -dbType mysql -initSchema
217219
```
218220

219-
![](https://upload-images.jianshu.io/upload_images/16782311-62391a0223e9c65d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
221+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/20240310185624312.png)
220222

221223
### 7.2 启动Hive
222224

docs/md/bigdata/Hive执行原理.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ GROUP BY pageid, age;
1717

1818
统计不同年龄用户访问不同网页的兴趣偏好:
1919

20-
![img](https://static001.geekbang.org/resource/image/0a/37/0ade10e49216575962e071d6fe9a7137.jpg)
20+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/0ade10e49216575962e071d6fe9a7137.jpg)
2121

2222
- 左边,要分析的数据表
2323
- 右边,分析结果
@@ -39,7 +39,7 @@ map函数的输出shuffle后,相同K及对应V放在一起,组成一个<K, V
3939

4040
在reduce函数内部,V集合里所有的数字被相加,然后输出。所以reduce输出就是<<2, 25>, 2>
4141

42-
![img](https://static001.geekbang.org/resource/image/bc/57/bc088edf00478c835003272696c44c57.jpg)
42+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/bc088edf00478c835003272696c44c57.jpg)
4343

4444
如此,一条SQL就被MapReduce计算完成。
4545

@@ -49,7 +49,7 @@ map函数的输出shuffle后,相同K及对应V放在一起,组成一个<K, V
4949

5050
Hive能直接处理我们输的SQL,调用MapReduce计算框架完成数据分析操作。
5151

52-
![](https://learning.oreilly.com/api/v2/epubs/urn:orm:book:9781491901687/files/images/hddg_1701.png)
52+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/hddg_1701.png)
5353

5454
通过Hive Client向Hive Server提交SQL命令:
5555

@@ -64,7 +64,7 @@ SELECT * FROM status_updates WHERE status LIKE 'michael jackson';
6464

6565
对应的Hive执行计划:
6666

67-
![](https://static001.geekbang.org/resource/image/cb/a6/cb1236ad035ca01cffbb9df47fa88fa6.jpg)
67+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/cb1236ad035ca01cffbb9df47fa88fa6.jpg)
6868

6969
Hive内部预置很多函数,Hive执行计划就是根据SQL语句生成这些函数的DAG,然后封装进MapReduce的map、reduce函数。该案例中的map函数调用三个Hive内置函数就完成map计算,且无需reduce。
7070

@@ -74,7 +74,7 @@ Hive内部预置很多函数,Hive执行计划就是根据SQL语句生成这些
7474

7575
pv_users表的数据无法直接得到,因为pageid来自用户访问日志,每个用户进行一次页面浏览,就会生成一条访问记录,保存在page_view表。而age年龄信息记录在表user。
7676

77-
![img](https://static001.geekbang.org/resource/image/82/2d/8254710229b1d749d08f7a0bb799ac2d.jpg)
77+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/8254710229b1d749d08f7a0bb799ac2d.jpg)
7878

7979
这两张表有相同字段userid,可连接两张表,生成pv_users表:
8080

@@ -84,7 +84,7 @@ SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.userid = u.userid);
8484

8585
该SQL命令也能转化为MapReduce计算,连接过程:
8686

87-
![](https://static001.geekbang.org/resource/image/25/2a/25d62b355c976beb5b26af865ac2b92a.jpg)
87+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/25d62b355c976beb5b26af865ac2b92a.jpg)
8888

8989
join的MapReduce计算过程和group by稍不同,因为join涉及两张表,来自两个文件(夹),所以要在map输出时进行标记,如来自第一张表的输出Value就记为<1, X>,这1表示数据来自第一张表。shuffle后,相同Key被输入到同一reduce函数,就可根据表的标记对Value数据求笛卡尔积,用第一张表的每条记录和第二张表的每条记录连接,输出即join结果。
9090

0 commit comments

Comments
 (0)