The Evolution of Common Leaf

Jianbing Fang

2020.01.15

The Story

Chaos...

The Story

// recommendation
GiveMeTheFuckingResultsNow();

The Story

Retrieval

Ranking

The Story

// retrieval stage
Retrieve();

// ranking stage
Rank();

The Story

Retrieval

Ranking

The Story

// retrieval stage
for (auto strategy : retrieval.GetStrategies()) {
  strategy.Run();
}

// many dirty work here, like context switch...

// ranking stage
for (auto processor : ranking.GetProcessors()) {
  processor.Apply();
}

The Story

Retrieval

Ranking

Pre-Stra.

Post-Stra.

The Story

// retrieval stage
for (auto strategy : retrieval.GetStrategies()) {
  for (auto processor : strategy.GetPreProcessors()) {
    processor.Apply1();
  }
  strategy.Run();
  for (auto processor : strategy.GetPostProcessors()) {
    processor.Apply1();
  }
}
// ranking stage
for (auto processor : ranking.GetProcessors()) {
  processor.Apply2();
}

The Story

Retrieval

Ranking

Pre-Stra.

Post-Stra.

Final-Stra.

The Story

// retrieval stage
for (auto strategy : retrieval.GetStrategies()) {
  for (auto processor : strategy.GetPreProcessors()) {
    processor.Apply1();
  }
  strategy.Run();
  for (auto processor : strategy.GetPostProcessors()) {
    processor.Apply1();
  }
}
for (auto processor : retrieval.GetFinalProcessors()) {
  processor.Apply1();
}
// ranking stage
for (auto processor : ranking.GetProcessors()) {
  processor.Apply2();
}

The Complexity of Leaf Framework

O(n)

Common Leaf

Pipeline

Pipeline

Finally

// the core of Common Leaf framework
for (auto pipeline : GetPipelines()) {
  for (auto processor : pipeline.GetProcessors()) {
    processor.Run();
  }
}

The Complexity of Leaf Framework

O(1)

Some Lessons

  • insight the original nature
  • embrace change
  • KEEP IT SIMPLE !!!

The End?

Maintainer

User

David John Wheeler said:

"All problems in computer science can be solved by another level of indirection."

Dragonfly

JSON Config

C++ Program

JSON Config

C++ Program

DSL

DSL Config

from dragonfly.common_leaf_dsl import LeafService, LeafFlow, IndexSource

# some config definitions here...

logical_flow = LeafFlow(name = "default")
logical_flow.retrieve_by_local_index(query) \
            .filter_by_browse_set() \
            .get_abtest_params(ab_config) \
            .limit(3000) \
            .common_predict(predict_config) \
            .ranking_by_lua(ranking_config) \
            .variant(variant_config) \
            .limit(20) \
            .leaf_show(leaf_show_config)

service = LeafService(service_name = "grpc_XxxCommonLeaf", index_source = IndexSource.LOCAL)
service.add_leaf_flows(leaf_flows = [logical_flow], request_type = "default") \
       .build()

Some Thoughts

  • maintenance vs performance
  • ease of use vs maintenance
  • transparency vs ease of use

Some Suggestions

  • naming! naming! naming!
  • spare more time on design
  • keep exploring

Thanks

Questions?

The Evolution of CommonLeaf

By Jesse Fang

The Evolution of CommonLeaf

  • 210