【问题标题】:How to separate Business logic and metrics log?如何分离业务逻辑和指标日志?
【发布时间】:2019-04-28 08:51:47
【问题描述】:

在许多应用程序中,我们需要记录统计指标,例如 hist、guage 等。这会污染业务逻辑。例如:

boolean buy(int id) {
  metrics.increament(); // for qps maybe.. 
  int remain = checkRemain();
  metrics.hist(remain); // log remain amount..
  if (remain > 0)
    return true;
  else
    return false;
}

其中,我希望,我只能写下商业逻辑,例如:

boolean buy(int id) {
  int remain = checkRemain();
  if (remain > 0)
    return true;
  else
    return false;
}

但我也可以获得指标。

我的问题是:分离业务逻辑和指标日志的最佳做法是什么?

我知道Aspect--Oriented Programming可以解决这个问题,我还有其他选择吗?

【问题讨论】:

  • 为什么不想选择AOP?
  • 您为什么关心更新业务逻辑中的指标?

标签: java spring design-patterns


【解决方案1】:

如果你不想使用 AOP,你可以实现一个观察者

https://en.wikipedia.org/wiki/Observer_pattern

定义一个观察者接口

public interface Observer {
    void buyed(int id, int remain);
}

然后在业务逻辑类中使用:

 private List<Observer> observers = new ArrayList<>();
 public void addObserver(Observer observer) {
    this.observers.add(observer);
 }

 boolean buy(int id){    
    int remain = checkRemain();
    for (Observer observer : this.observers) {
        observer.buyed(id, remain);
    }
    if (remain > 0){  
      return true;
    } else
     return false;
}

Metrics 类实现观察者接口

class Metrics implements Observer {
   void buyed(int id, int remain){
       metrics.increment();
       metrics.hist(remain); 
   }
....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多