1

我正在尝试使用 apache flink 有状态函数来实现消息传递场景。我的状态之一能够通过提供给 MatchBinder 的两个不同函数进行更新。这两个函数基本上检查当前状态并相应地更新状态。

  • 如果为同一个键同时调用这两个函数会发生什么?
  • 是否有用于调用相同键的有状态函数的队列机制?
  • 我们可以锁定状态访问/更新以进行顺序访问吗?
4

1 回答 1

1

如果为同一个键同时调用这两个函数会发生什么?

MatchBinder 基本上是编写单个 StateFun 函数的便捷方式,该函数首先匹配传入消息的类型(或属性)来开始执行。这基本上是一种避免编写这样的代码的方法:

...
if (message instanceof A) {
  handleA((A) message);
} else if (message instanceof B) {
  handleB((B) message);
}
...

因此,实际上,尽管您为每个绑定案例提供了“不同的”Java 函数,但调用的是同一个 StateFun 函数,并且会选择正确的绑定案例。

是否有用于调用相同键的有状态函数的队列机制?

是的,StateFun 函数将按地址顺序调用。当函数应用于特定地址时,不会同时应用该地址的其他消息。这几乎是免费的,这要归功于 Apache Flink 作为实际的运行时。

我们可以锁定状态访问/更新以进行顺序访问吗?

每个地址的状态访问和修改都是原子的和顺序的。

于 2020-07-20T08:50:31.100 回答