You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@gearpump.apache.org by "Manu Zhang (JIRA)" <ji...@apache.org> on 2016/04/21 10:00:35 UTC
[jira] [Created] (GEARPUMP-68) If-statement support in DAG
Manu Zhang created GEARPUMP-68:
----------------------------------
Summary: If-statement support in DAG
Key: GEARPUMP-68
URL: https://issues.apache.org/jira/browse/GEARPUMP-68
Project: Apache Gearpump
Issue Type: New Feature
Reporter: Manu Zhang
imported from [https://github.com/gearpump/gearpump/issues/1456] on behalf of [~whjiang]
h1. Goal
Currently, in Gearpump, publisher will publish each message to all the subscriptions. However, there are cases that need to selectively publish to certain subscription. E.g. in fraud detection use case, a threshold will be checked to determine which route to go (a good user, a bad user or a suspicious user?). Basically, this routing was represented as an IF-statement.
{code}
if (is_from_good_user(message))
no more check needed
else if(is_from_bad_user(message))
alert and no more check needed
else
perform additional check to decide
{code}
To support such routing, we need selectively route at processor level. (#1343 is on task level instead of processor level.)
h1. Solution
h2. solution 1
Solution 1 is a workaround solution. No change need from Gearpump core part. Each If-then-else statement was represented as 2 processors
{code}
upstream ~> conditionTrueFilter ~> thenClause #filter out the false condition messages in conditionTrueFilter
upstream ~> conditionFalseFilter ~> elseClause #filter out the true condition messages in conditionFalseFilter
{code}
The main advantage of this solution is no need to change any code at Gearpump core side.
The main disadvantages are:
It is hard to maintain. E.g. for dynamic DAG, if such day in future we need to change the condition, we need to carefully change both nodes. Otherwise, they will be inconsistent.
Bad performance. if the two condition filters are not at the same JVM as upstream. It means we will see significant network transport which is unnecessary.
Hard to understand. User need to learn this BKM to write if-statement.
Bad to express on UI. From DAG structure, it is impossible to know which one is the then clause and which one is the else clause. So, user is unable to have insight of the goodness of the condition check. E.g. does the condition check succeed in most cases?
h2. Solution 2
Solution 2 is to add built-in support for if-statement. Basically, the design is:
# Allow a processor to have more than one output channels. Each channel has a name. Each channel has a default output channel named "out". Processor can add alias names.
# Each channel can have multiple subscribers. Thus, for dynamic DAG, user can dynamically add/remove subscriptions for certain channel.
So, it is quite easy to implement if-statment support using this solution:
A special IFProcessor is created. It has two output channels then and else. UI can show the channel name on edge. Inside IFProcessor, user can write code output("then", msg) to output to then channel.
DSL can be expressed like this
{code}
upstream.if(condition, thenClause, elseClause)
{code}
or
{code}
val ifStmt = upstream.if(condition)
ifStmt.then(thenClause)
ifStmt.else(elseClause)
{code}
Low level API can express as
{code}
A#"then" ~ partioner ~> B
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)