Hi Gyula,
if you look at the internal API you'll notice that it is pretty much like
your second proposal. Just for reference, the interface is roughly this:

public interface InternalTimerService<N> {
  long currentProcessingTime();
  long currentWatermark();
  void registerProcessingTimeTimer(N namespace, long time);
  void deleteProcessingTimeTimer(N namespace, long time);
  void registerEventTimeTimer(N namespace, long time);
  void deleteEventTimeTimer(N namespace, long time);
}

that namespace bit can be anything for which you can provide a
TypeSerializer.

IMHO, this goes back a bit to the discussion about adding a low level
operator-like interface that allows pretty much anything a custom operator
can do but with a defined, stable interface. The internal operator
interface is somewhat in flux, still, so I wouldn't recommend people to use
it directly.

The only thing missing, really, from TimelyFlatMap is access to namespaces
for state and timers. With that, you could implement even the
WindowOperator as a TimelyFlatMap since I worked on abstracting everything
that it uses away behind interfaces that any operator can use. The last
pice, the generic timer API went in last, of course. :-)

Cheers,
Aljoscha

On Fri, 28 Oct 2016 at 16:55 Gyula Fóra <gyf...@apache.org> wrote:

> Hello,
>
> I was thinking about the methods provided by the timely functions and the
> timerservice and I am wondering if it makes sense to change them a little
> so they can cover a wider set of use case. Maybe I missed something
> completely obvious so please shoot me down in that case :)
>
> Currently the user gets a TimerService to register timers that will in the
> future call the onTimer method. It is not completely obvious to me how
> would I implement a function that needs to trigger two types of callbacks
> in the future. If I get only one onTimer method I should be able to pass in
> some sort of parameter or flag so I can branch in my onTimer
> implementation.
>
> As parameters are not supported I am left with states that are scoped to
> the keys which is also pretty useless if I want to trigger different timed
> actions for the same keys.
>
> I know this is quite tricky but I see some alternative options:
>  - The register timer method returns a unique (per key) timer id, so we can
> associate state with this id to fetch info about the timer registered. (We
> could also remove timers with this id and maybe add methods to remove all
> for the current key)
>  - Allow the users to pass a custom parameter when registering the
> callback, and the parameter would be passed to the onTimer method
>  - Allow users to pass custom callback functions when registering the
> timers, but this would mean we have to support some sort of context for
> accessing the state (like the window context before)
>  - We could go for an annotation based API like in beam but thats probably
> not good to mix in the current ones
>
> I personally prefer the first one.
>
> What do you think?
>
> Regards,
> Gyula
>

Reply via email to