Ice IceStorm

IceStorm作用

一个高效的用于Ice应用的发布/订阅服务

使用IceStrom的好处

1.IceStorm 使收集器与监视器解除耦合,极大地简化了收集器实现。
2.要把IceStorm结合进来,发布者和监视器应用所需做出的改动非常少。

概念

1.消息

  • IceStorm的消息是强类型的,由对某个Slice操作的调用代表:操作名标识消息的类型,操作参数定义消息内容。所以>IceStorm 的消息递送使用的是“推”模式;轮询模式不支持。

2.主题

  • 应用要通过订阅某个主题 (topic)来表明自己有兴趣接收某些消息。 IceStorm 服务器能够支持任意数量的主题,这些主题是动态创建的,通过唯一的名字来区分。每个主题都可以有多个发布者和订阅者。
  • 在本质上,一个主题和一个由应用定义的 Slice 接口是等价的:该接口的各操作定义该主题所支持的消息的类型。发布者使用主题接口的代理来发送它的消息,而订阅者则为了接收消息而实现主题接口。

3.单向语义

  • IceStorm 消息具有单向语义 ( 参见 2.2.2 节 ),因此发布者无法接收来自 其订阅者的答复。

4.联盟

  • 联盟是通过主题间创建连接而形成的,又叫做主题图。链接是两个主题之间的无向关联,链接是有成本的,可能会限制消息在该链接上的递送。
  • 在一个联盟中,从最初的主题开始计算,消息最多只在主题之间递送一跳。

5.持久

  • IceStorm拥有一个数据库,存储主题和链接的信息,但不会存储消息。

6.订阅者出错

  • 因为 IceStorm 消息是采用单向语义递送的, IceStorm 只能检测到连接或超时错误。如果在把消息递送给订阅者的过程中, IceStorm 遇到这样的错误,该订阅者就会立刻被解除与该消息对应的主题的订阅。
  • 慢速的订阅者也可能会造成问题。一旦消息发布, IceStorm 会立刻尝试递送它们:IceStorm 发布者对象可能会一收到消息就嵌套地调用主题的订阅者。因此,如果订阅者消费消息的速度没有发布的速度快,它就可能造成 IceStorm 中的线程数不断增加。如果线程数到达了线程池的最大尺寸, 那么就不再能发布新消息了。

IceStorm 接口综述

1.TopicManager

TopicManager 是一个单体对象,充当的是 Topic 对象的工厂和仓库
 module IceStorm {
        dictionary<string, Topic*> TopicDict;
        exception TopicExists {
            string name;
        };
        exception NoSuchTopic {
            string name;
        };
        interface TopicManager {
            Topic* create(string name) throws TopicExists;
            nonmutating Topic* retrieve(string name) throws NoSuchTopic;
            nonmutating TopicDict retrieveAll();
        }; 
};
create 操作用于创建一个新主题,该主题必须具有唯一的名字。 
retrieve 操作允许客户获取某个已有主题的代理。
retrieveAll 返回一个词典,内含所有已有的主题。

2.Topic

Topic 接口表示一个主题,它提供了若干管理操作,可用于配置链接、 管理订阅者。
module IceStorm {
        struct LinkInfo {
            Topic* theTopic;
            string name;
            int cost;
        };
        sequence<LinkInfo> LinkInfoSeq;
        dictionary<string, string> QoS;
        exception LinkExists {
            string name;
        };
        exception NoSuchLink {
            string name;
        };
        interface Topic {
            nonmutating string getName();
            nonmutating Object* getPublisher();
            void subscribe(QoS theQoS, Object* subscriber);
            idempotent void unsubscribe(Object* subscriber);
                idempotent void link(Topic* linkTo, int cost)
                throws LinkExists;
            idempotent void unlink(Topic* linkTo) throws NoSuchLink;
            nonmutating LinkInfoSeq getLinkInfoSeq();
            void destroy();
        }; 
};
getName 操作返回的是指派给该主题的名字。
getPublisher 操作返回的是该主题的发布者对象的代理。
subscribe 操作把一个订阅者的代理添加到主题中;如果已经有一个订阅者代理具有相同的对象标识,新的订阅者代理就会取代旧的。 
unsubscribe 操作从主题中移除一个订阅者。
要创建与另一个主题的链接,要使用 link 操作;如果与给定的主题已经有链接,就会引发 LinkExists 异常。
要销毁链接,使用 unlink 操作。
最后,destroy 操作用于永久性地销毁主题。

IceStorm 的管理

$ icestormadmin -h
Usage: icestormadmin [options] [file...] Options:
-h, --help
-v, --version
-DNAME
-DNAME=DEF
-UNAME
-IDIR
-e COMMANDS
-d, --debug
Show this message.
Display the Ice version.
Define NAME as 1.
Define NAME as DEF.
Remove any definition for NAME.
Put DIR in the include file search path.
Execute COMMANDS.
Print debug messages.

help 命令会显示以下使用信息:
    help
    exit, quit :退出本程序。
    create TOPICS :添加 TOPICS。
    destroy TOPICS :移除 TOPICS。 
    link FROM TO COST :采用给定的 COST 把 FROM 链接到 TO。 
    unlink FROM TO :解除 TOFROM 的链接。 
    graph DATA COST :按照 DATA 中的描述,采用 COST 构造链接图。 
    list [TOPICS] :显示 TOPICS 或所有主题上的信息。

主题联盟

1.消息传播

  • IceStorm 消息的传播不会超过一个链接

2.成本

  • 当你在某个主题上发布消息时,主 题会拿与它的每个链接相关联的成本与消息的成本进行比较,并且只在那 些成本等于或超过消息成本的链接上传播该消息。
  • 消息的成本在 Ice 请求上下文中指定。每个 Ice 代理操作都有一个隐含 的参数,类型是 Ice::Context,用于表示请求上下文 ( 参见 16.8 节 )。这 个参数很少使用,但用来指定 IceStorm 消息的成本很理想,因为如果应用 确实要使用 IceStorm 的成本特性,它只需提供一个请求上下文。如果请求 上下文没有包含成本值,消息就会被赋予缺省的成本值零 (0)。

3.管理工具脚本

  • 使主题图的创建自动化的一种途径是,创建一个文本文件,其中含有要 由 IceStorm 管理工具执行的命令。例如,可以用下面的命令来创建图 26.5 中的主题图:
    create A B C
    link A B 0
    link A C 1
    如果我们把这些命令存储在文件 graph.txt 中,我们可以用下面的命 令来执行它们:
    $ icestormadmin –Ice.Config=config graph.txt 我们假定,配置文件 config 中含有属性
    IceStorm.TopicManager.Proxy 的定义。

4.XML 图描述符

<?xml version="1.0" encoding="iso-8859-1"?>
<graph>
  <vertex-set>
    <vertex name="A"/>
    <vertex name="B"/>
    <vertex name="C"/>
    <vertex name="D"/>
    <vertex name="E"/>
  </vertex-set>
  <edge-set>
    <edge source="A" target="B" cost="1"/>
    <edge source="A" target="C" cost="2"/>
    <edge source="C" target="D" cost="1"/>
    <edge source="D" target="E" cost="1"/>
  </edge-set>
</graph>

配置IceStorm

服务器配置

IceBox.Service.IceStorm=IceStormService,1.0.0:create
IceBox.DBEnvName.IceStorm=db
IceStorm.TopicManager.Endpoints=tcp -p 9999
IceStorm.Publish.Endpoints=tcp

1.第一个属性定义 IceStorm 服务的进入点。服务名决定了 IceStorm 配置属性的前缀。使用 IceStorm 作为服务名并非是强制性的,但如果你 没有更偏爱的名字,我们建议你就使用这个名字。
2.IceStorm 使用了 Freeze 来管理服务的持久状态,因此第二个属性指定了用于这个服务的 Freeze 数据库环境目录的路径名 。在这个例子中使用的是 db 目录,在当前的工作目录中必须已经存在该目录。
3.最后的两个属性指定的是 IceStorm 对象适配器所使用的端点;注意,它们的属性名是以 IceStorm 起头的,与服务名相吻合。 
    TopicManager 属性指定的是 TopicManager 和 Topic 对象所在的端点;通常这些端点使用的是面向连接的协议,比如 TCP或SSL。 
    Publish 属性指定的是主题发布者对象使用的端点。

客户配置

IceStorm.TopicManager.Proxy=IceStorm/TopicManager:tcp -p 9999
端点必须与 IceStorm.TopicManager.Endpoints 属性定义的端点相吻合,
而对象标识必须使用 IceStorm 服务名来做标识范畴,并用 TopicManager 做标识名。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值