[
https://issues.apache.org/jira/browse/GEARPUMP-68?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15251518#comment-15251518
]
Manu Zhang commented on GEARPUMP-68:
------------------------------------
The comments history is too long to put here. Please refer to the original
issue link for more context.
> 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)