可以在与StreamReceiver / Visitor不同的节点上执行Ignite Streamer.addData吗?

时间:2018-08-23 13:39:10

标签: ignite

是否可以从客户端节点进行流注入并在服务器节点中拦截相同的流以在插入缓存之前处理该流?

这样做的原因是客户端节点从外部源接收流,并且需要基于跨多个服务器节点的AffinityKey将相同的流注入到分区缓存中。流需要在每个节点上被拦截并以最低的延迟进行处理。 我本可以使用缓存事件来执行此操作的,但是StreamVisitor应该更快。

以下是我尝试执行的示例。开始2个节点:一个包含流媒体,另一个包含streamReciever:

公共类StreamerNode {
    公共静态void main(String [] args){         ......         Ignition.setClientMode(false);         点燃ignite = Ignition.start(igniteConfiguration);

    CacheConfiguration<SeqKey, String> myCfg = new CacheConfiguration<SeqKey, String>("myCache");
    ......
    IgniteCache<SeqKey, String> myCache = ignite.getOrCreateCache(myCfg);
    IgniteDataStreamer<SeqKey, String> myStreamer = ignite.dataStreamer(myCache.getName()); // Create Ignite Streamer for windowing data

    for (int i = 51; i <= 100; i++) {
        String paddedString = org.apache.commons.lang.StringUtils.leftPad(i+"", 7, "0") ;
        String word = "TEST_" + paddedString;
        SeqKey seqKey = new SeqKey("TEST", counter++ );
        myStreamer.addData(seqKey, word) ;
    }
}

}

公共类VisitorNode {
    公共静态void main(String [] args){         ......         Ignition.setClientMode(false);         点燃ignite = Ignition.start(igniteConfiguration);

    CacheConfiguration<SeqKey, String> myCfg = new CacheConfiguration<SeqKey, String>("myCache");
    ......
    IgniteCache<SeqKey, String> myCache = ignite.getOrCreateCache(myCfg);
    IgniteDataStreamer<SeqKey, String> myStreamer = ignite.dataStreamer(myCache.getName()); // Create Ignite Streamer for windowing data

    myStreamer.receiver(new StreamVisitor<SeqKey, String>() {
        int i=1 ;
        @Override
        public void apply(IgniteCache<SeqKey, String> cache, Map.Entry<SeqKey, String> e) {
            String tradeGetData = e.getValue();
            System.out.println(nodeID+" : visitorNode ..count="+ i++ + " received key="+e.getKey() + " : val="+ e.getValue());
            //do some processing here before inserting in the cache .. 
            cache.put(e.getKey(), tradeGetData);
        }
    });
}

}

1 个答案:

答案 0 :(得分:1)

当然,它可以在其他节点上执行。通常,addData()在客户端节点上执行,StreamReceiver在服务器节点上运行。您无需做任何特殊的事情就可以实现它。

对于您的其余文章,您是否可以用更多详细信息和示例进行详细说明?我无法理解所需的设置。

如果您不需要修改数据,只需对其进行操作即可使用连续查询。