服务层 - Orch

最后,为了方便各个服务使用,SONiC还在通信层上进行了更进一步的封装,为各个服务提供了一个基类:Orch

由于有了上面这些封装,Orch中关于消息通信的封装就相对简单了,主要的类图如下:

Note

注意:由于这一层是服务层,所以其代码是在sonic-swss的仓库中,而不是sonic-swss。这个类中除了消息通信的封装以外,还提供了很多和服务实现相关的公共函数,比如,日志文件等等。

可以看到,Orch主要是封装了SubscriberStateTableConsumerStateTable来简化和统一消息的订阅,核心代码非常简单,就是根据不同的数据库类型来创建不同的Consumer,如下:

void Orch::addConsumer(DBConnector *db, string tableName, int pri)
{
    if (db->getDbId() == CONFIG_DB || db->getDbId() == STATE_DB || db->getDbId() == CHASSIS_APP_DB) {
        addExecutor(
            new Consumer(
                new SubscriberStateTable(db, tableName, TableConsumable::DEFAULT_POP_BATCH_SIZE, pri),
                this,
                tableName));
    } else {
        addExecutor(
            new Consumer(
                new ConsumerStateTable(db, tableName, gBatchSize, pri),
                this,
                tableName));
    }
}

参考资料

  1. SONiC Architecture
  2. Github repo: sonic-swss
  3. Github repo: sonic-swss-common