diff --git a/README.md b/README.md index 288ff8d..80801af 100644 --- a/README.md +++ b/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 +* 支持分布式集群 + ## 下单成功截图 ![下单成功图片](./data/images/order_success.png) diff --git a/env.py.example b/env.py.example index 3b586c2..918031e 100644 --- a/env.py.example +++ b/env.py.example @@ -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" diff --git a/env.slave.py.example b/env.slave.py.example new file mode 100644 index 0000000..2352dec --- /dev/null +++ b/env.slave.py.example @@ -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 密码 没有可以留空 + +# 没了,其它配置会自动从主节点同步 diff --git a/py12306/query/job.py b/py12306/query/job.py index 0e7a559..71bcee4 100644 --- a/py12306/query/job.py +++ b/py12306/query/job.py @@ -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) diff --git a/py12306/user/job.py b/py12306/user/job.py index 3a99dfa..25589c1 100644 --- a/py12306/user/job.py +++ b/py12306/user/job.py @@ -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