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

|

|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
# 12306 账号
|
# 12306 账号
|
||||||
USER_ACCOUNTS = [
|
USER_ACCOUNTS = [
|
||||||
|
# 目前已支持仅查询,不下单,屏蔽掉下面的账号即可
|
||||||
{
|
{
|
||||||
'key': 0, # 如使用多个账号 key 不能重复
|
'key': 0, # 如使用多个账号 key 不能重复
|
||||||
'user_name': 'your user name',
|
'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_ENABLED = 0
|
||||||
OUT_PUT_LOG_TO_FILE_PATH = 'runtime/12306.log' # 日志目录
|
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 = [
|
QUERY_JOBS = [
|
||||||
{
|
{
|
||||||
|
# 'job_name': 'bj -> sz', # 任务名称,不填默认会以车站名命名,不可重复
|
||||||
'account_key': 0, # 将会使用指定账号下单
|
'account_key': 0, # 将会使用指定账号下单
|
||||||
'left_dates': [ # 出发日期 :Array
|
'left_dates': [ # 出发日期 :Array
|
||||||
"2019-01-25",
|
"2019-01-25",
|
||||||
@@ -82,6 +93,8 @@ QUERY_JOBS = [
|
|||||||
|
|
||||||
},
|
},
|
||||||
# {
|
# {
|
||||||
|
# 'job_name': 'cd -> gz', # 任务名称,不填默认会以车站名命名,不可重复
|
||||||
|
# 'account_key': 0, # 将会使用指定账号下单
|
||||||
# 'left_dates': [
|
# 'left_dates': [
|
||||||
# "2019-01-27",
|
# "2019-01-27",
|
||||||
# "2019-01-28"
|
# "2019-01-28"
|
||||||
|
|||||||
12
env.slave.py.example
Normal file
12
env.slave.py.example
Normal 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 密码 没有可以留空
|
||||||
|
|
||||||
|
# 没了,其它配置会自动从主节点同步
|
||||||
@@ -182,7 +182,6 @@ class Job:
|
|||||||
if Config().is_cluster_enabled():
|
if Config().is_cluster_enabled():
|
||||||
if self.cluster.get_lock(lock_id, Cluster.lock_do_order_time,
|
if self.cluster.get_lock(lock_id, Cluster.lock_do_order_time,
|
||||||
{'node': self.cluster.node_name}): # 获得下单锁
|
{'node': self.cluster.node_name}): # 获得下单锁
|
||||||
QueryLog.add_quick_log('拿到锁' + lock_id).flush()
|
|
||||||
order_result = self.do_order(user)
|
order_result = self.do_order(user)
|
||||||
if not order_result: # 下单失败,解锁
|
if not order_result: # 下单失败,解锁
|
||||||
self.cluster.release_lock(lock_id)
|
self.cluster.release_lock(lock_id)
|
||||||
|
|||||||
@@ -83,7 +83,6 @@ class UserJob:
|
|||||||
return True
|
return True
|
||||||
# 只有主节点才能走到这
|
# 只有主节点才能走到这
|
||||||
if self.is_first_time() or not self.check_user_is_login():
|
if self.is_first_time() or not self.check_user_is_login():
|
||||||
a = 1
|
|
||||||
self.is_ready = False
|
self.is_ready = False
|
||||||
if not self.handle_login(): return
|
if not self.handle_login(): return
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user