支持分布式集群
This commit is contained in:
32
README.md
32
README.md
@@ -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
|
||||
* 支持分布式集群
|
||||
|
||||
## 下单成功截图
|
||||

|
||||
|
||||
|
||||
@@ -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
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 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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user