websocket 和 flask-streaming 从场景方面有什么区别
Whats difference between websocket and flask-streaming from scenario aspect
我正在开发一个BS kafka监控工具。该程序将监听一个 kafka 主题,并不断输出该主题的新消息。那么将这些消息不断发送到浏览器端的最佳方法是什么?
该程序使用 flask,所以目前我正在使用 stream_with_context 向浏览器端发送新消息。这目前有效,但我想知道这是否是使用 stream_with_context 的正确方案,因为大多数用例是用于下载和视频流?或者我应该使用 websocket?
@read_controller.route('/v1/listenkafka/<string:kafkaId>', methods=['GET'])
def start_stream(kafkaId):
try:
mykafka_json = eval(my_storage.get(kafkaId))
mykafka = kafkaserver(ip=mykafka_json['ip'], id=kafkaId, port=mykafka_json['port'])
return Response(stream_with_context(mykafka.consume_topic(mykafka_json['topic'])))
except Exception as e:
print(f"{e}")
return jsonify(f"{e}"), 400
#The generator listen to kafka and feed to stream
def consume_topic(self, topic, groupid='test-consumer-group'):
consumer = KafkaConsumer(topic,
group_id=groupid,
bootstrap_servers=[f"{self.ip}:{self.port}"])
print(f"Topic: {topic}@{self.ip}:{self.port} starts steaming at {datetime.now()}")
try:
for messages in consumer:
mykafka_json = eval(my_storage.get(self.id))
print(mykafka_json)
if mykafka_json['flag']:
my_storage.delete(self.id)
return
else:
message = {'topic':messages.topic,
'partition':messages.partition,
'offset':messages.offset,
'key':messages.key,
'value':messages.value}
print (message['value'])
yield message['value']
except StopIteration as e:
#TODO:: handle return
print(e)
finally:
print(f"Topic-{topic} finish at {datetime.now()}")
那么,在这种情况下我应该使用 stream_with_context 还是应该切换到使用 websockt?
谢谢
好的,我明白了。
stream_with_context实际上会return每次前端请求时从头开始的ALL内容。
所以它是一个下载工具,而不是不断从服务器向客户端推送新数据的工具
最终,我选择了 flask-socketIO,它是比 websocket 更好的选择,但是你需要研究示例以了解它是如何工作的...文档遗漏了一些细节...
我正在开发一个BS kafka监控工具。该程序将监听一个 kafka 主题,并不断输出该主题的新消息。那么将这些消息不断发送到浏览器端的最佳方法是什么?
该程序使用 flask,所以目前我正在使用 stream_with_context 向浏览器端发送新消息。这目前有效,但我想知道这是否是使用 stream_with_context 的正确方案,因为大多数用例是用于下载和视频流?或者我应该使用 websocket?
@read_controller.route('/v1/listenkafka/<string:kafkaId>', methods=['GET'])
def start_stream(kafkaId):
try:
mykafka_json = eval(my_storage.get(kafkaId))
mykafka = kafkaserver(ip=mykafka_json['ip'], id=kafkaId, port=mykafka_json['port'])
return Response(stream_with_context(mykafka.consume_topic(mykafka_json['topic'])))
except Exception as e:
print(f"{e}")
return jsonify(f"{e}"), 400
#The generator listen to kafka and feed to stream
def consume_topic(self, topic, groupid='test-consumer-group'):
consumer = KafkaConsumer(topic,
group_id=groupid,
bootstrap_servers=[f"{self.ip}:{self.port}"])
print(f"Topic: {topic}@{self.ip}:{self.port} starts steaming at {datetime.now()}")
try:
for messages in consumer:
mykafka_json = eval(my_storage.get(self.id))
print(mykafka_json)
if mykafka_json['flag']:
my_storage.delete(self.id)
return
else:
message = {'topic':messages.topic,
'partition':messages.partition,
'offset':messages.offset,
'key':messages.key,
'value':messages.value}
print (message['value'])
yield message['value']
except StopIteration as e:
#TODO:: handle return
print(e)
finally:
print(f"Topic-{topic} finish at {datetime.now()}")
那么,在这种情况下我应该使用 stream_with_context 还是应该切换到使用 websockt?
谢谢
好的,我明白了。
stream_with_context实际上会return每次前端请求时从头开始的ALL内容。
所以它是一个下载工具,而不是不断从服务器向客户端推送新数据的工具
最终,我选择了 flask-socketIO,它是比 websocket 更好的选择,但是你需要研究示例以了解它是如何工作的...文档遗漏了一些细节...