CDN网络,用于加速用户获取的资源, 并且减少内容源站的负载,边缘节点会承接大量的加速频道,但不同的加速频道对应的需求各不相同,需要的业务场景也不一样,就需要对不同的频道提供个性化服务。 所以需要提供一种分频道配置,类似nginx的 block 块配置,来隔离不同的频道配置,配置更新又不影响其他的频道配置,来提高服务稳定性。
解决上述的问题,一般需要解决几个场景。
1: 存在大量的加速频道,不同的频道但存在大量的相同的配置项,如何避免冗余配置数据。
2:解析分频道配置时,如何不影响主线程的服务。
3:单加速频道的配置更新,如何不影响其他频道的配置,提高服务稳定性。
4. 单客户存在多个加速域名的情况下,如何减少配置文件。
5. 更改频道配置,如何解决新旧请求对频道配置的引用
1:首先可以先设计一个分频道子类,每个分频道就生成一个 channelConfig 对象,设计一个hashTable 来实现不同分频域名映射channelConfig的关系。
struct ChannelConfig {
// 配置项类型
struct Item {
...
};
ChannelConfigs() : { memset(_items, 0, sizeof(_items)); };
bool parse_file(const char *filename);
char *_key;
volatile int _rec_count; ==> 当前分频道配置的引用个数
... ==> 其他
};
2:每次请求都将引用同个 channelConfig 对象,避免内存占用,每次进行配置变更都需要进行减少计数引用 rec_count 变量, 要是为0时,说明可以释放了.
3: 需要采用读写锁的方式,来对整个 hashTable 进行锁定,避免对应的占用锁导致性能下降
4:需要开辟一个独立的线程进行解析分频道配置,当解析完成后, 在进行更新 hashTable 的数据.
5: 提供一个类似 *.test.com的正则匹配的分频道配置文件,进而使得同个客户存在多个相同业务使用相同的后缀域名,使用同一个分频道配置。
6:提炼公共的配置项,存放在一个公共配置文件,对所有加速域名都生效,当在获取到请求 host 域名相关的信息时,需要进行一次查找分频道配置,用来将分频道配置的内容值覆盖公共配置的配置值,使得配置生效。