flask线程 / web短链接
Posted 江小凡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask线程 / web短链接相关的知识,希望对你有一定的参考价值。
问题是这样的:开始有一个功能因为处理流程比较复杂,中间需要对接其他平台,自然在整个访问的稳定性以及访问延迟难以保障,甚至还会出现http连接错误,已经导致服务变慢,其他服务也受到影响不能正常稳定提供服务。此外在高并发下,这个功能业务是需要在同一事务执行。
我认为这个服务可以解耦合,情况比较紧急,所以我起草了一个方案提交通过之后就开始动手了。首先我把这个功能的承载业务的入口和返回结果的出口函数给分离开,使用kafka作为队列保存业务信息,用户提交信息既可。kafka队列实时监听,获取到消息之后就开始处理业务函数保证一个事务一个锁执行。后台处理也可以允许更长时间的轮询。但是这里我把消费者与生产者放到一个服务中,原本不会有问题,在测试环境一切正常。为保证稳定性,我自己还做了一下压力测试,显示正常稳定。
于是,上线开始服务,问题出现了。消费者开始工作了一会儿,没有消费了,kafka待消费数量开始上涨,这个情况开始出现一刹那,就感觉不对。于是,查看代码,添加检索日志,更新在测试环境,测试环境依旧没有问题。上传代码,上线,最后加一句关键的sleep(0.03)(kafka python 启动蜜汁操作)。查看后台kafka数据,果然开始又开始消费了,比之前好一些,从之前断开的偏移量开始,数据没有丢失,也没有重复消费。但是,一个时间点消费到零之后,消费者不消费了,处于一个假死状态。
我怀疑是监听线程被杀死,导致这个监听topic的功能没能进行下去,业务代码比较简单。看了很多次没发现异常,使用线程保护设置守护线程依旧不行,网上看了一下相关问题,没有找到什么答案。
继续解耦合,另起一个服务,专门处理kafka消费,彼此独立。编写jobs,docker file ,提交代码。后台实际还是以flask作为web服务,但不需要在启动app实例。上线测试,还是有问题,不消费。说明根源就是线程被kill,设置主线程在main下执行。编写docker file ,更改为python启动, 设置gunicorn worker数量和kafka一致。打包上线,消费者正常了!
之后整理了一下思路,出现的问题原因如下:
if __name__ == '__main__':
t = Thread(target=run_schedule)
t.start()
context = ('cert.pem', 'key.pem')
app.run(host='0.0.0.0',port=8080,debug=False,ssl_context=context)
if __name__ == "__main__":
main_thread_pool = ThreadPoolExecutor(10)
main_thread_pool.submit(worker)
run_schedule和worker将
函数永远循环,偶尔解除阻塞以执行任务。
显然,当我不再调试时,使用类似gunicorn的wsgi服务器,它会通过main()
调用模块,因此线程无法启动。将它们放在该块之外是行不通的,因为如果任何其他代码导入模块,线程就会启动!
--*--*- -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
web短链接服务其实实现起来比较简单,我实现了简单功能,提供了后台访问,自行访问。访问如下:就可以了!(新域名:soovv.com (索夫) 还未备案!)
以上是关于flask线程 / web短链接的主要内容,如果未能解决你的问题,请参考以下文章
php 一个短代码片段准备在WooCommerce Thank You页面上输出货件跟踪UI。
Web开发Python实现Web服务器(Flask测试统计图表)