You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

区块链系统并发下载与更新互斥同步方案咨询

区块链系统读写互斥同步解决方案

需求概述

现有区块链系统中,参与者本地挖矿后将区块上传至中央服务器,同时从服务器下载区块链以继续挖矿。需实现以下同步规则:

  • 区块链文件未更新时,允许多用户同时下载
  • 当有用户上传更新区块时,所有下载请求必须等待更新完成后才能执行
  • 更新过程中禁止任何下载操作,更新完成后恢复下载权限

核心实现方案:读写锁机制

采用**读写锁(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:33:30