brms: best (and worst) practices and real world examples · brms: best (and worst) practices and...

37
1 Rules Fest – October 2011 BRMS: Best (and worst) Practices and Real World Examples Edson Tirelli Senior Software Engineer JBoss, by Red Hat

Upload: ledang

Post on 27-Jul-2018

223 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

1 Rules Fest – October 2011

BRMS: Best (and worst) Practices and Real World

Examples

Edson Tirelli

Senior Software Engineer

JBoss, by Red Hat

Page 2: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

2 Rules Fest – October 2011

It all starts with a question...

What is the performance of <BRMS product name>?

Page 3: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

3 Rules Fest – October 2011

Followed by...

Are there any best practices (a.k.a blue prints) to achieve performance <X>?

Page 4: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

4 Rules Fest – October 2011

Lets talk about blue prints...

... but first, lets open our eyes to everything rules engineshave to offer us!

Page 5: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

5 Rules Fest – October 2011

BRMS adoption goals

Page 6: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

6 Rules Fest – October 2011

A simple analogy

Business Rules EnginesBusiness Rules Engines(Rules)(Rules)

DatabasesDatabases(Data)(Data)

Page 7: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

7 Rules Fest – October 2011

BRMS: goals

● Independent Lifecycle Management of Business Rules

Page 8: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

8 Rules Fest – October 2011

BRMS: goals

● Declarative language for rules and queries

● Focus on “what to do”, not “how to do it”

rule “Send shipment pick-up SMS alert”

when

There is a shipment order

There is a route assigned to the order

There is a truck GPS reading and the truck is 15m from the pick-up location

then

Send SMS to customer: ARRIVING, “15 minutes”

end

rule “Send shipment pick-up SMS alert”

when

There is a shipment order

There is a route assigned to the order

There is a truck GPS reading and the truck is 15m from the pick-up location

then

Send SMS to customer: ARRIVING, “15 minutes”

end

Page 9: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

9 Rules Fest – October 2011

BRMS: goals

● Logic, Data and Tasks split

● Centralization of Knowledge

● Consistency● Testing / Simulation● Auditing

● Explanation Facility

Knowledge Base

(productionmemory/

rules)

Knowledge Session(workingmemory/

facts/data)

InferenceEngine

Tasks(services,

procedures,etc)

* Directly or Indirectly

Page 10: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

10 Rules Fest – October 2011

BRMS: goals

● Execution Performance and Scalability

● Many-to-many pattern matching algorithm● Optimizes the whole set of rules● Performance is linear on the number of

rules “touched” by each fact● Easily scales to tens of thousands of rules● Eager evaluation with incremental

changes re-evaluation

Page 11: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

11 Rules Fest – October 2011

Under the hood

Page 12: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

12 Rules Fest – October 2011

Rete in 30 seconds

● Classic Rete algorithm “idea”

● Discrimination network● Facts arrive at the top● Propagate down● If they reach the bottom,

corresponding rule activates

● + Enables optimizations

● + Enables additional feature set

Fact Types

Filter conditions(alpha network)

Join conditions(beta network)

Rules

Page 13: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

13 Rules Fest – October 2011

Typical Rete Optimizations

● Support to POJOs as facts ● no mapping/data copy necessary

● Full split between KBase and Working Memory● lightweight session creation● knowledge base sharing

● Completely Dynamic KBase management● Hot addition/removal/updates of rules/queries/processes

● Full support to First Order Logic and Set operations

● JIT compilation for constraints and data access

Page 14: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

14 Rules Fest – October 2011

Typical Rete Optimizations

● Node Sharing (constraint sharing)

● Alpha Hashing:● Provides O(1) performance for mutually exclusive constraints

● Rule 1: Customer is GOLD

● Rule 2: Customer is SILVER

● Rule 3: Customer is BRONZE

● Rule x: Customer is XYZ

Uses a hash function instead of checking each constraint

Page 15: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

15 Rules Fest – October 2011

Typical Rete Optimizations

● Beta Memory Indexing:

● Provides O(1) performance for joins

Order( customerId == $someCustomer.id )

● FOL lazy match:

● Avoids wasted matching on FOL conditional elements

exists( Customer( age > 50 ) )

Page 16: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

16 Rules Fest – October 2011

Typical Rete Optimizations: Visual Index

Fact Types

Filter conditions(alpha network)

Join conditions(beta network)

Rules

Node Sharing

Alpha Hashing

Memory Indexing

Class type caching(+ inheritance support)

FOL Lazy match

Aggregations/Accumulations

Page 17: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

17 Rules Fest – October 2011

Best Practices

Page 18: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

18 Rules Fest – October 2011

BRMS Best Practices

● Don't try to micro-control rules execution

● Use the Conflict Resolution Strategies instead● Salience● Agenda groups● Ruleflow● Dynamic enablement

Knowledge Base

(productionmemory/

rules)

Knowledge Session(workingmemory/

facts/data)

InferenceEngine

Tasks(services,

procedures,etc)

Page 19: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

19 Rules Fest – October 2011

BRMS Best Practices

● Partition your Knowledge Bases properly

● Subject matter● Transaction / Service / Unit of Work● Business Entity

● Avoid monolithic kbases

● Avoid fine grained kbasesKnowledge

Base(productionmemory/

rules)

Knowledge Session(workingmemory/

facts/data)

InferenceEngine

Tasks(services,

procedures,etc)

Page 20: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

20 Rules Fest – October 2011

BRMS Best Practices

● Cache the Knowledge Base, share the sessions

● Rules are usually JIT compiled at load time● Can be compiled at build time for non-dynamic use

cases

Knowledge Base

(productionmemory/

rules)

Knowledge Session(workingmemory/

facts/data)

InferenceEngine

Tasks(services,

procedures,etc)

Page 21: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

21 Rules Fest – October 2011

BRMS Best Practices

● Don't overload rules

● Each rule should describe one and only one scenario→action mapping

● The engine will optimize shared conditions● The engine supports inference

rule “Short sale”

when

$ss : SecuritySaleOrder()

not( Security( this == $ss.security ) )

then

// identify as a short sale

insert( new ShortSale( $ss ) );

end

rule “Short sale”

when

$ss : SecuritySaleOrder()

not( Security( this == $ss.security ) )

then

// identify as a short sale

insert( new ShortSale( $ss ) );

end

rule “Refuse short sales”

when

$ss : SecuritySaleOrder()

exists( ShortSale( this.ss == $ss ) )

then

// refuse order

$ss.refuse();

end

rule “Refuse short sales”

when

$ss : SecuritySaleOrder()

exists( ShortSale( this.ss == $ss ) )

then

// refuse order

$ss.refuse();

end

Page 22: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

22 Rules Fest – October 2011

BRMS Best Practices

● Avoid the use of “evals”

● Harder for the engine to optimize● Harder for rule authors to maintain

● Use engine features:

● Pluggable operators● Annotations● ... rule “Simultaneous calls from different places”

@system( “Fraud Detection” ) @requirementId( “FD001” )

when

$c1 : VoiceCall()

$c2 : VoiceCall( cust == $c1.cust, base != $c1.base,

base notAdjancent $c1.base )

then

// possible fraud detected

end

rule “Simultaneous calls from different places”

@system( “Fraud Detection” ) @requirementId( “FD001” )

when

$c1 : VoiceCall()

$c2 : VoiceCall( cust == $c1.cust, base != $c1.base,

base notAdjancent $c1.base )

then

// possible fraud detected

end

Page 23: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

23 Rules Fest – October 2011

BRMS Best Practices

● Batch data loads

● It is usually faster to load 1000 facts and then fire the rules than fire rules after each inserted fact

● Partition the data into multiple sessions

● Transaction / Service / Unit of work● Creating a new session is cheap

● Sometimes cheaper than

removing facts from existing

session.

Knowledge Base

(productionmemory/

rules)

Knowledge Session(workingmemory/

facts/data)

InferenceEngine

Tasks(services,

procedures,etc)

Page 24: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

24 Rules Fest – October 2011

BRMS Best Practices

● Quality of the data/fact model is directly proportional to the performance and maintainability of the rules using it

● Think about the DBMS analogy● Flatter models improve performance● Smaller classes help avoiding recursions

Knowledge Base

(productionmemory/

rules)

Knowledge Session(workingmemory/

facts/data)

InferenceEngine

Tasks(services,

procedures,etc)

Page 25: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

25 Rules Fest – October 2011

Best Practices in Rules Authoring

Page 26: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

26 Rules Fest – October 2011

A Frog Rule: anything odd about it?

rule “11111”

# NOTE: Please note that this rule is associated with rule #22222. If you make any changes in

# its logic, please do the same for rule #22222

when

# RULE CHANNEL MANDATORY SECTION

ControlFact( a[“11111”].b[this.X].enabled == true, a[“11111”].s[this.S] == true )

# BUSINESS LOGIC

Frog( color == “green” ) and

( #rule 22222

Frog( eval( height.bigDecimalValue.compareTo( somePrince.height.bigDecimalValue ) > 0 ) )

) || ( #rule 33333

Prince( name == “Charming”)

) || ( #rule 44444

...

)

then

// An empty “consequence”

end

rule “11111”

# NOTE: Please note that this rule is associated with rule #22222. If you make any changes in

# its logic, please do the same for rule #22222

when

# RULE CHANNEL MANDATORY SECTION

ControlFact( a[“11111”].b[this.X].enabled == true, a[“11111”].s[this.S] == true )

# BUSINESS LOGIC

Frog( color == “green” ) and

( #rule 22222

Frog( eval( height.bigDecimalValue.compareTo( somePrince.height.bigDecimalValue ) > 0 ) )

) || ( #rule 33333

Prince( name == “Charming”)

) || ( #rule 44444

...

)

then

// An empty “consequence”

end

PS: lets focus on the structure of the rule and not the actual logic.

Page 27: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

27 Rules Fest – October 2011

A Frog Rule: looks suspicious

rule “11111”

# NOTE: Please note that this rule is associated with rule #22222. If you make any changes in

# its logic, please do the same for rule #22222

when

# RULE CHANNEL MANDATORY SECTION

ControlFact( a[“11111”].b[this.X].enabled == true, a[“11111”].s[this.S] == true )

# BUSINESS LOGIC

Frog( color == “green” ) and

( #rule 22222

Frog( eval( height.bigDecimalValue.compareTo( somePrince.height.bigDecimalValue ) < 0 ) )

) || ( #rule 33333

Prince( name == “Charming”)

) || ( #rule 44444

...

)

then

// An empty “consequence”

end

rule “11111”

# NOTE: Please note that this rule is associated with rule #22222. If you make any changes in

# its logic, please do the same for rule #22222

when

# RULE CHANNEL MANDATORY SECTION

ControlFact( a[“11111”].b[this.X].enabled == true, a[“11111”].s[this.S] == true )

# BUSINESS LOGIC

Frog( color == “green” ) and

( #rule 22222

Frog( eval( height.bigDecimalValue.compareTo( somePrince.height.bigDecimalValue ) < 0 ) )

) || ( #rule 33333

Prince( name == “Charming”)

) || ( #rule 44444

...

)

then

// An empty “consequence”

end

Empty consequence?

Rule name as part of the logic?

Use of control fact?

“Embedded” rules?

Over use of evals?

Page 28: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

28 Rules Fest – October 2011

Why is an empty consequence bad?

rule “11111”

when

...

then

// An empty “consequence”

end

rule “11111”

when

...

then

// An empty “consequence”

end

Breaks independent lifecycle management goal

Breaks centralization of knowledge goal

Breaks clarity goal (what to do?)

Breaks explanation facility goal

The Frog will never turn into a Prince

Should this be a query instead?

Page 29: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

29 Rules Fest – October 2011

Alternatives: Rules vs Queries

Rules Queries

Control Invoked by the engine Invoked by the application

Parameters Don't support parameters Support parameters

Results Execute actions Return results

rule “Transform Frog into Prince”

when

$f : Frog( color == “green” )

then

insert( new Prince( “Mark” ) );

retract( $f );

end

rule “Transform Frog into Prince”

when

$f : Frog( color == “green” )

then

insert( new Prince( “Mark” ) );

retract( $f );

end

query “Get the frog”( $color )

when

$f : Frog( color == $color )

end

query “Get the frog”( $color )

when

$f : Frog( color == $color )

end

Page 30: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

30 Rules Fest – October 2011

Why is bad to use the rule name in the logic?

Breaks clarity goal

Breaks “one scenario – one action” best practice

Rule names must be unique within the knowledge base

Usually leads to micro-control and procedural code

rule “11111”

when

ControlFact( a[“11111”].b[this.X].enabled == true, a[“11111”].s[this.S] == true )

...

( #rule 22222

...

rule “11111”

when

ControlFact( a[“11111”].b[this.X].enabled == true, a[“11111”].s[this.S] == true )

...

( #rule 22222

...

Page 31: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

31 Rules Fest – October 2011

Alternatives for metadata declaration

Use annotations

Do not use metadata in conditions

It is ok to use metadata in consequences

If necessary, metadata is available to the enabled attribute

rule “11111 – transform the frog into a prince”

@requirementId( “11111” ) @author( “Mark” )

@relatedTo( “22222, 33333” )

@documentation( “A rule with lots of annotations” )

when

...

then

insert( new Prince( “Mark” ) );

messenger.announceTheWedding( drools.getRule().getMetaData().get( “requirementId” ) );

end

rule “11111 – transform the frog into a prince”

@requirementId( “11111” ) @author( “Mark” )

@relatedTo( “22222, 33333” )

@documentation( “A rule with lots of annotations” )

when

...

then

insert( new Prince( “Mark” ) );

messenger.announceTheWedding( drools.getRule().getMetaData().get( “requirementId” ) );

end

Page 32: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

32 Rules Fest – October 2011

Why Control Facts should be avoided?

Breaks clarity goal

Breaks one scenario – one action best practice

Leads to micro-control and procedural code

Usually leads to runtime overhead

Sometimes, control facts are useful, but not for the general case

rule “11111”

when

ControlFact( a[“11111”].b[this.X].enabled == true, a[“11111”].s[this.S] == true )

...

( #rule 22222

...

rule “11111”

when

ControlFact( a[“11111”].b[this.X].enabled == true, a[“11111”].s[this.S] == true )

...

( #rule 22222

...

Page 33: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

33 Rules Fest – October 2011

Alternatives for control facts

Use rule attributes for conflict resolution

Use enabled expressions to conditionally disable rules

Do not abuse of salience

Let the engine do its job

rule “11111 – transform the frog into a prince”

agenda-group “x”

ruleflow-group “y”

salience 10

enabled ( ... a boolean expression ... )

when

...

rule “11111 – transform the frog into a prince”

agenda-group “x”

ruleflow-group “y”

salience 10

enabled ( ... a boolean expression ... )

when

...

Usually one of these attributes is enough

Page 34: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

34 Rules Fest – October 2011

Why “embedded” rules are bad?

Breaks independent lifecycle management

Breaks clarity goal

Breaks explanation facility goal

Breaks performance goal

Breaks one scenario – one action best practice

Increases maintenance cost and testing complexity

( #rule 22222

Frog( eval( height.bigDecimalValue.compareTo( somePrince.height.bigDecimalValue ) < 0 ) )

) || ( #rule 33333

Prince( name == “Charming”)

) || ( #rule 44444

...

)

( #rule 22222

Frog( eval( height.bigDecimalValue.compareTo( somePrince.height.bigDecimalValue ) < 0 ) )

) || ( #rule 33333

Prince( name == “Charming”)

) || ( #rule 44444

...

)

Breaks independent lifecycle management

Breaks clarity goal

Breaks explanation facility goal

Breaks performance goal

Breaks one scenario – one action best practice

Increases maintenance cost and testing complexity

Page 35: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

35 Rules Fest – October 2011

Alternatives for “embedded rules”

rule “11111.a – Teenagers are eligible”

when

$p : Person( age >= 16 && <= 18 )

then

insert( new Eligible( $p ) );

end

rule “11111.a – Teenagers are eligible”

when

$p : Person( age >= 16 && <= 18 )

then

insert( new Eligible( $p ) );

end

rule “11111.b – Elders are eligible”

when

$p : Person( age >= 60 )

then

insert( new Eligible( $p ) );

end

rule “11111.b – Elders are eligible”

when

$p : Person( age >= 60 )

then

insert( new Eligible( $p ) );

end

rule “11111.b – Elders are eligible”

when

$p : Person( age >= 60 )

then

insert( new Eligible( $p ) );

end

rule “11111.b – Elders are eligible”

when

$p : Person( age >= 60 )

then

insert( new Eligible( $p ) );

end

rule “11111.c – Eligibles get discount”

no-loop

when

$t : Ticket()

$e : Eligible()

then

modify($t) { setDiscount( 0.25 ) }

end

rule “11111.c – Eligibles get discount”

no-loop

when

$t : Ticket()

$e : Eligible()

then

modify($t) { setDiscount( 0.25 ) }

end

Page 36: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

36 Rules Fest – October 2011

Alternatives for “embedded rules”

One scenario – one action

Allow the engine to do its job

Take advantage of flow control features

Page 37: BRMS: Best (and worst) Practices and Real World Examples · BRMS: Best (and worst) Practices and Real World Examples ... Lets talk about blue prints... ... It is usually faster to

37 Rules Fest – October 2011

Q&A

Edson [email protected]

Yes, we also dopair programming!