我知道通过设计和开箱即用的Flink不可能进行请求和答复数据处理。但是,以旧式TCP应用程序为例,该应用程序打开了与服务器的连接,并期望在相同的连接中得到响应。
例如,考虑旧版应用程序,其中客户端通过TCP和自定义协议连接到服务器。他们发送一些状态信息,并期望命令作为响应,其中命令可能取决于当前状态。
是否有可能构建一个组合源,将TCP消息输入到处理中,然后接收,以接收处理结果?
构建一个可以接受TCP连接并根据消息创建事件的源似乎很简单,但是在同一个worker(!)上获得对相应接收器的相应响应,以将响应发送给客户端似乎很棘手。
我知道这可以通过外部组件实现,但是我想知道是否可以在Flink中以最小的开销直接实现(例如出于实时性能的考虑)。
如果这是可能的话,将采取什么方式以及利弊?
谢谢!
此致
坎
答案 0 :(得分:0)
通常,如果您在Flink中与外部服务进行通话,则应使用AsyncFunction。这使您可以使用传入数据来确定要发出的请求,并将结果作为操作员输出。有什么理由为什么这种方法对您不起作用?
请注意,如果您没有任何传入数据,例如有一个源会定期发出“ tickler”记录,然后触发异步请求。
如果结果需要反馈到下一个请求中,则可以使用iterations,尽管它们有局限性。
答案 1 :(得分:0)
这取决于您的服务器处理管道的外观。
如果可以将处理建模为单个链,如源-> Map / flatMap / filter-> Map / flatMap / filter-> ...->水槽,则可以在下一个传递TCP连接本身与数据一起操作(我认为应该包装在一个元组或POJO中)。由于是链的一部分,因此可以确保整个计算在单个工作程序中进行。
但是,当您进行分组,窗口等操作时,这将不再可能,因为处理可能会在另一个工作程序上继续进行。