我用RabbitMQ + Celery + flask + sqlalchemy ORM插入数据。 芹菜工人在两台服务器上共计16个。 数据量约为一百万。
如果数据一个接一个地排队到MQ并从Celery一个接一个地插入, 一切都好。 所有数据都插入良好。
但是当我尝试在芹菜中使用forloop批量插入一些大小(大约5000,1000等)时,会遗漏一些数据。 我写了很多日志,但我找不到任何错误或特殊的东西。 (如果数据的数量是100,000而不是100万,也可以)
简单的逻辑是......
tasks.py
@celery.task(bind=True, acks_late=False, ignore_result=True, max_retries=None)
def insert_data(self):
logger.info("START")
InsertData(somedata..)
logger.info("END")
@celery.task(bind=True, acks_late=False, ignore_result=True, max_retries=None)
def insert_data_bulk(self):
logger.info("START")
for i in range(5000):
InsertData(somedata..)
logger.info("END")
def InsertData(data):
logger.info("Insert START")
# my_db_engine's option : {'echo': True, 'pool_recycle': 3600, 'pool_size': 10, 'pool_reset_on_return': 'commit', 'isolation_level': 'AUTOCOMMIT'}
ss = scoped_session(sessionmaker(autocommit=False, autoflush=False,
bind=my_db_engine))
t = mymodel(**data)
ss.add(t)
ss.commit()
logger.info("Insert END")
test.py
for i in range(1000000):
insert_data_one.apply_async() # make one million messages for MQ
for i in range(200):
insert_data_bulk.apply_async() # make 200 message for MQ
insert_data_one表现良好。
log is ..
- START
- 插入START
- 插入END
- END
醇>
但是insert_data_bulk会随机删除一些数据!!
log is ..
- START
- 插入START
- END(3。插入END< - 有时会错过日志。) 或..
- START
- END(错过了2,3,我从未找到它们)
醇>
数据库中的总行数随时都不同。
我没有设置Celery的超时。 数据库的超时与我的sqlalchemy选项匹配。
你有什么想法吗? 请提供任何检查提示; - (