我知道,通过设计和开箱即用的要求和答复数据处理是不可能与flink。但考虑一个遗留的tcp应用程序,它打开一个到服务器的连接,并期望在同一个连接中得到响应。
例如,考虑一个遗留应用程序,其中客户端通过tcp和自定义协议连接到服务器。它们发送一些状态信息并期望命令作为响应,其中命令可能取决于当前状态。
是否可以构建一个组合的源(将tcp消息输入到处理中)和接收器(接收处理结果)?
构建一个接受tcp连接并从消息中创建事件的源代码看起来很简单,但是在同一个worker()上获得相应的响应要将响应发送给客户机,请参阅这很棘手。
我知道,这可以通过外部组件实现,但我想知道这是否可以直接在flink中以最小的开销实现(例如,出于实时性能的原因)。
如果这是可能的,有什么方法可以做到这一点,有哪些利弊?
谢谢您!
当做,
菅直人
2条答案
按热度按时间mrfwxfqh1#
通常,如果您在flink中与外部服务通信,您将使用async函数。这允许您使用传入的数据来确定要发出的请求,并将结果作为操作符输出。有没有任何理由说明这种方法不适合你?
请注意,如果没有任何传入数据,您可以玩一些游戏,例如,有一个源定期发出“tickler”记录,然后触发异步请求。
如果结果需要反馈到下一个请求中,可以使用迭代,尽管它们有局限性。
rjee0c152#
这取决于服务器处理管道的外观。
如果可以将处理建模为单个链,如source->map/flatmap/filter->map/flatmap/filter->…->sink,然后您可以将tcp连接本身与数据一起传递给下一个操作(我假设是用tuple或pojo Package 的)。由于是链的一部分,因此可以保证整个计算在单个worker中进行。
但是,当您执行分组、窗口等操作时,这就不可能了,因为处理可能会在另一个工作进程上继续。