Igniters,

I'm concerned with our continuous query API and deployment procedure.

Continuous queries have remote filters, that can be deployed over peer
class loading mechanism (this functionality is currently broken though:
IGNITE-3653 <https://issues.apache.org/jira/browse/IGNITE-3653>, IGNITE-9181
<https://issues.apache.org/jira/browse/IGNITE-9181>).
In usual cases P2P class loading makes sense, but problems begin when a
node, that deployed the CQ, leaves cluster. By default the CQ is undeployed
in this case. But ContinuousQuery has *autoUnsubscribe*
<https://ignite.apache.org/releases/latest/javadoc/org/apache/ignite/cache/query/ContinuousQuery.html#setAutoUnsubscribe-boolean->
property. If set to true, it lets a continuous query stay in cluster, when
initiator leaves.
So, you may end up in a situation, when a continuous query remote filter is
deployed in a cluster, but the node, that the class was loaded from, is
already gone.
New nodes won't have where to load the remote filter class from in this
case. Also existing nodes may have problems, since class loading of
dependencies of the loaded class happens lazily (and cannot happen
eagerly), so they also need the initiator node.

The *autoUnsubscribe* property helps to deploy continuous queries, that
listen to cache updates and react to them in the remote filters. This is
pretty convenient, since it allows cache updates be processed locally,
right where updates happen, without sending data over network. Such
continuous query may not even have a local listener, so initiator node may
deploy the query and leave.

*BUT*

   - The deployed CQ becomes impossible to undeploy. It stays in the
   cluster till the end of times.
   - This case looks like a miss-use of the remote filters. They should
   *filter*, but not *listen* and *react*. Remote filter should be a
   stateless predicate rather than a clever callback.
   - It causes the problems with P2P class loading, mentioned above.

So, I'd like to see the *autoUnsubscribe *property deprecated and removed.

This use-case should be covered by a different mechanism, that will allow
to deploy a listener into a cluster by name. It should support deployment
SPI <https://apacheignite.readme.io/docs/deployment-spi> instead of peer
class loading. It may be built on top of continuous queries, but have a
more suitable API.

What do you think?

Denis

Reply via email to