Python -Eve 框架中不同端口上的服务对数据的写读不一致问题如何解决?
问题描述:现在有两个服务分别运行在 a 和 b 端口上(在同一台服务器上,使用同一个数据库)。a 服务负责写数据,b 服务读数据,问题就出在 b 服务总是无法读取到 a 服务最新写入的数据(确认数据已经写入,并且查询语句也没有问题)。然后在重启 b 服务之后,就会拿到最新的数据。。。
补充: 使用 gunicorn+gevent 启的服务,不过这个应该没有影响。我怀疑不同端口服务是否存在类似跨域保护的东西,或者是缓存?才导致这个问题,有没有大佬遇到过类似的问题,求解。
Python -Eve 框架中不同端口上的服务对数据的写读不一致问题如何解决?
1 回复
这个问题我遇到过。在Eve里,不同端口服务读写不一致,通常是MongoDB连接配置或数据版本控制的问题。
核心解决方案:
- 确保所有服务连接同一个MongoDB实例和数据库
- 正确配置数据版本控制(ETag)
- 使用相同的DOMAIN配置
完整代码示例:
# 服务A(写服务,端口5000) - run_write_service.py
from eve import Eve
from eve.auth import BasicAuth
class TokenAuth(BasicAuth):
def check_auth(self, username, password, allowed_roles, resource, method):
# 这里实现你的认证逻辑
return username == 'admin' and password == 'secret'
app = Eve(auth=TokenAuth)
# 确保启用ETag和数据版本控制
app.config['DOMAIN'] = {
'items': {
'schema': {
'name': {'type': 'string'},
'status': {'type': 'string'}
},
# 关键配置:启用ETag和数据版本控制
'versioning': True,
'cache_control': 'max-age=20,must-revalidate',
'cache_expires': 20,
'etag': 'inline',
'item_lookup_field': '_id',
'item_url': 'regex("[a-f0-9]{24}")'
}
}
# MongoDB连接配置(所有服务必须一致)
app.config['MONGO_HOST'] = 'localhost'
app.config['MONGO_PORT'] = 27017
app.config['MONGO_DBNAME'] = 'mydatabase'
app.config['MONGO_URI'] = 'mongodb://localhost:27017/mydatabase'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=False)
# 服务B(读服务,端口5001) - run_read_service.py
from eve import Eve
app = Eve()
# 必须使用完全相同的DOMAIN配置
app.config['DOMAIN'] = {
'items': {
'schema': {
'name': {'type': 'string'},
'status': {'type': 'string'}
},
'versioning': True,
'cache_control': 'max-age=20,must-revalidate',
'cache_expires': 20,
'etag': 'inline',
'item_lookup_field': '_id',
'item_url': 'regex("[a-f0-9]{24}")'
}
}
# 相同的MongoDB配置
app.config['MONGO_HOST'] = 'localhost'
app.config['MONGO_PORT'] = 27017
app.config['MONGO_DBNAME'] = 'mydatabase'
app.config['MONGO_URI'] = 'mongodb://localhost:27017/mydatabase'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001, debug=False)
关键点说明:
versioning: True和etag: 'inline'确保数据一致性- 相同的
MONGO_URI保证连接同一个数据库 - 相同的
DOMAIN配置确保schema一致 - 可以考虑在应用层加个简单的缓存同步机制
测试脚本:
# test_consistency.py
import requests
import time
# 写数据到服务A
write_url = "http://localhost:5000/items"
read_url = "http://localhost:5001/items"
# 写入数据
data = {"name": "test_item", "status": "active"}
response = requests.post(write_url, json=data, auth=('admin', 'secret'))
item_id = response.json()['_id']
# 等待缓存过期
time.sleep(1)
# 从两个服务读取并比较
response1 = requests.get(f"{write_url}/{item_id}", auth=('admin', 'secret'))
response2 = requests.get(f"{read_url}/{item_id}")
print(f"服务A数据: {response1.json()}")
print(f"服务B数据: {response2.json()}")
print(f"数据一致: {response1.json() == response2.json()}")
运行方式:
# 启动MongoDB
mongod
# 启动写服务
python run_write_service.py
# 启动读服务(新终端)
python run_read_service.py
# 测试一致性
python test_consistency.py
一句话总结: 统一MongoDB连接和DOMAIN配置,启用ETag版本控制。

