区块链系统并发下载与更新互斥同步方案咨询
区块链系统读写互斥同步解决方案
需求概述
现有区块链系统中,参与者本地挖矿后将区块上传至中央服务器,同时从服务器下载区块链以继续挖矿。需实现以下同步规则:
- 区块链文件未更新时,允许多用户同时下载
- 当有用户上传更新区块时,所有下载请求必须等待更新完成后才能执行
- 更新过程中禁止任何下载操作,更新完成后恢复下载权限
核心实现方案:读写锁机制
采用**读写锁(Read-Write Lock)**是最匹配该需求的方案,它的特性正好适配读写场景:
- 读操作(下载):支持多请求并发获取读锁,不互相阻塞
- 写操作(上传更新):独占写锁,此时所有读请求会被阻塞,直到写操作完成并释放锁
服务器端代码示例(Python Flask)
如果服务器基于单进程多线程部署,可直接用threading.RLock实现:
from flask import Flask, send_file, request import threading import os app = Flask(__name__) # 初始化可重入读写锁 rw_lock = threading.RLock() # 区块链文件存储路径 BLOCKCHAIN_STORAGE_PATH = "blockchain_data.dat" @app.route('/download', methods=['GET']) def download_chain(): # 获取读锁,支持并发读 rw_lock.acquire() try: return send_file(BLOCKCHAIN_STORAGE_PATH, as_attachment=True) finally: # 无论请求是否成功,都释放读锁 rw_lock.release() @app.route('/upload', methods=['POST']) def upload_chain(): # 获取写锁,阻塞所有读和其他写请求 rw_lock.acquire() try: # 先接收临时文件,避免中途上传失败损坏原文件 temp_file = request.files['blockchain'] temp_path = f"{BLOCKCHAIN_STORAGE_PATH}.tmp" temp_file.save(temp_path) # 这里可添加区块完整性校验逻辑(比如哈希验证、区块链连续性验证) # 校验通过后替换原文件 os.replace(temp_path, BLOCKCHAIN_STORAGE_PATH) return {"code": 200, "msg": "区块链更新成功"} except Exception as e: return {"code": 500, "msg": f"更新失败:{str(e)}"} finally: # 释放写锁,恢复读请求 rw_lock.release() if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
多进程部署适配方案
如果服务器采用多进程部署(如Gunicorn多Worker),线程锁会失效,此时可以选择:
- 文件锁:用
fcntl模块实现跨进程的文件锁,确保同一时间只有一个写操作,读操作需等待写锁释放 - 分布式锁:借助Redis的RedLock机制,实现跨机器、跨进程的读写互斥,适合分布式部署场景
额外优化建议
- 客户端侧:添加等待提示,当请求被阻塞时,提示用户“服务器正在更新区块链,请稍后重试”
- 服务器侧:记录读写锁的状态日志,便于排查同步问题
- 上传校验:必须添加区块完整性验证,避免无效或恶意的区块替换原链
内容的提问来源于stack exchange,提问作者germes mercury
相关产品推荐
相关产品推荐

