Skip to content

Commit

Permalink
支持分布式集群
Browse files Browse the repository at this point in the history
  • Loading branch information
pjialin committed Jan 10, 2019
1 parent c804de2 commit 2ee8dc5
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 5 deletions.
32 changes: 29 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# 🚂 py12306 购票助手
支持多账号,多任务购票
分布式,多账号,多任务购票

## 前言
今年回家的票明显要难买很多,早早就答应了父母今年的票没问题,到现在一张票没买到,虽然家里已经订了汽车票,让我不用操心,但是想想他们一行还有小孩,心还是很伤的。
Expand All @@ -12,7 +12,7 @@
- [x] 电话语音通知
- [x] 多账号、多任务、多线程支持
- [x] 单个任务多站点查询
- [ ] 分布式运行
- [x] 分布式运行
- [ ] Docker 支持
- [ ] 邮件通知
- [ ] Web 管理页面
Expand Down Expand Up @@ -41,7 +41,7 @@ cp env.py.example env.py

**3. 启动前测试**

目前提供了一些简单的测试
目前提供了一些简单的测试,包括用户账号检测,乘客信息检测,车站检测等

开始测试 -t
```bash
Expand All @@ -59,6 +59,32 @@ python main.py -t -n
python main.py
```

### 参数列表

- -t 测试配置信息
- -t -n 测试配置信息以及通知消息
- -c 指定自定义配置文件位置

### 分布式集群

集群依赖于 redis,目前支持情况
- 单台主节点多个子节点同时运行
- 主节点宕机后自动切换提升子节点为主节点
- 主节点恢复后自动恢复为真实主节点
- 配置通过主节点同步到所有子节点
- 主节点配置修改后无需重启子节点,支持自动更新
- 子节点消息实时同步到主节点

**使用**

将配置文件的中 `CLUSTER_ENABLED` 打开即开启分布式

目前提供了一个单独的子节点配置文件 `env.slave.py.example` 将文件修改为 `env.slave.py`, 通过 `python main -c env.slave.py` 即可快速启动

## 更新
### 19-01-10
* 支持分布式集群

## 下单成功截图
![下单成功图片](./data/images/order_success.png)

Expand Down
13 changes: 13 additions & 0 deletions env.py.example
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

# 12306 账号
USER_ACCOUNTS = [
# 目前已支持仅查询,不下单,屏蔽掉下面的账号即可
{
'key': 0, # 如使用多个账号 key 不能重复
'user_name': 'your user name',
Expand Down Expand Up @@ -44,9 +45,19 @@ NOTIFICATION_VOICE_CODE_PHONE = 'your phone' # 接受通知的手机号
OUT_PUT_LOG_TO_FILE_ENABLED = 0
OUT_PUT_LOG_TO_FILE_PATH = 'runtime/12306.log' # 日志目录

# 分布式集群配置
CLUSTER_ENABLED = 0 # 集群状态
NODE_IS_MASTER = 1 # 是否是主节点 同时只能启用 1 个主节点
NODE_SLAVE_CAN_BE_MASTER = 1 # 主节点宕机后,子节点是否可以自动提升为主节点(建议打开)
NODE_NAME = 'master' # 节点名称,不能重复
REDIS_HOST = 'localhost' # Redis host
REDIS_PORT = '6379' # Redis post
REDIS_PASSWORD = '' # # Redis 密码 没有可以留空

# 查询任务
QUERY_JOBS = [
{
# 'job_name': 'bj -> sz', # 任务名称,不填默认会以车站名命名,不可重复
'account_key': 0, # 将会使用指定账号下单
'left_dates': [ # 出发日期 :Array
"2019-01-25",
Expand Down Expand Up @@ -82,6 +93,8 @@ QUERY_JOBS = [

},
# {
# 'job_name': 'cd -> gz', # 任务名称,不填默认会以车站名命名,不可重复
# 'account_key': 0, # 将会使用指定账号下单
# 'left_dates': [
# "2019-01-27",
# "2019-01-28"
Expand Down
12 changes: 12 additions & 0 deletions env.slave.py.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# encoding=utf8
# 分布式子节点配置文件示例

# 分布式集群配置
CLUSTER_ENABLED = 1 # 集群状态
NODE_IS_MASTER = 0 # 是否是主节点
NODE_NAME = 'slave 1' # 节点名称,不能重复
REDIS_HOST = 'localhost' # Redis host
REDIS_PORT = '6379' # Redis post
REDIS_PASSWORD = '' # # Redis 密码 没有可以留空

# 没了,其它配置会自动从主节点同步
1 change: 0 additions & 1 deletion py12306/query/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,6 @@ def handle_seats(self, allow_seats, ticket_info):
if Config().is_cluster_enabled():
if self.cluster.get_lock(lock_id, Cluster.lock_do_order_time,
{'node': self.cluster.node_name}): # 获得下单锁
QueryLog.add_quick_log('拿到锁' + lock_id).flush()
order_result = self.do_order(user)
if not order_result: # 下单失败,解锁
self.cluster.release_lock(lock_id)
Expand Down
1 change: 0 additions & 1 deletion py12306/user/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@ def check_heartbeat(self):
return True
# 只有主节点才能走到这
if self.is_first_time() or not self.check_user_is_login():
a = 1
self.is_ready = False
if not self.handle_login(): return

Expand Down

0 comments on commit 2ee8dc5

Please sign in to comment.