支持分布式集群

This commit is contained in:
Jalin
2019-01-10 13:47:31 +08:00
parent c804de2e07
commit 2ee8dc5da1
5 changed files with 54 additions and 5 deletions

View File

@@ -1,5 +1,5 @@
# 🚂 py12306 购票助手
支持多账号,多任务购票
分布式,多账号,多任务购票
## 前言
今年回家的票明显要难买很多,早早就答应了父母今年的票没问题,到现在一张票没买到,虽然家里已经订了汽车票,让我不用操心,但是想想他们一行还有小孩,心还是很伤的。
@@ -12,7 +12,7 @@
- [x] 电话语音通知
- [x] 多账号、多任务、多线程支持
- [x] 单个任务多站点查询
- [ ] 分布式运行
- [x] 分布式运行
- [ ] Docker 支持
- [ ] 邮件通知
- [ ] Web 管理页面
@@ -41,7 +41,7 @@ cp env.py.example env.py
**3. 启动前测试**
目前提供了一些简单的测试
目前提供了一些简单的测试,包括用户账号检测,乘客信息检测,车站检测等
开始测试 -t
```bash
@@ -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)

View File

@@ -2,6 +2,7 @@
# 12306 账号
USER_ACCOUNTS = [
# 目前已支持仅查询,不下单,屏蔽掉下面的账号即可
{
'key': 0, # 如使用多个账号 key 不能重复
'user_name': 'your user name',
@@ -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",
@@ -82,6 +93,8 @@ QUERY_JOBS = [
},
# {
# 'job_name': 'cd -> gz', # 任务名称,不填默认会以车站名命名,不可重复
# 'account_key': 0, # 将会使用指定账号下单
# 'left_dates': [
# "2019-01-27",
# "2019-01-28"

12
env.slave.py.example Normal file
View File

@@ -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 密码 没有可以留空
# 没了,其它配置会自动从主节点同步

View File

@@ -182,7 +182,6 @@ class Job:
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)

View File

@@ -83,7 +83,6 @@ class UserJob:
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