本文介绍一个自已创建的消息产生器EachToOneMessageGenerator,即每隔intervalhosts每个节点都创建一个消息,不同于MessageEventGenerator(每隔interval,整个网络只产生一个消息)。

1. 消息事件产生器

The ONE源码包提供了4种消息事件产生方式,分别是:

  • MessageEventGenerator每隔interval,整个网络只产生一个消息
  • OneToEachMessageGenerator整个仿真期间最多产生tohosts个消息
  • OneFromEachMessageGenerator整个仿真期间最多产生hosts个消息
  • MessageBurstGenerator每隔interval,每个源节点hosts为每个目的节点tohosts产生一个新消息

相关博文如下:

本文旨在创建一个消息事件产生器EachToOneMessageGenerator,即每隔intervalhosts每个节点都创建一个消息。

2. EachToOneMessageGenerator

2.1 仿真结果

先看下由EachToOneMessageGenerator产生的消息创建报告CreatedMessagesReport,相关的设置文件如下:

Events1.class = EachToOneMessageGenerator
Events1.hosts = 10,20
Events1.tohosts = 30,40
Events1.interval = 25,35

Report.report2 = CreatedMessagesReport

产生的消息创建报告CreatedMessagesReport,取部分如下(重点看下fromHosttoHost列):

# time  ID  size  fromHost  toHost  TTL  isResponse
32.0000 M1  984638 p10 p34 300 N 
32.0000 M2  800811 p11 p34 300 N 
32.0000 M3  922110 p12 p31 300 N 
32.0000 M4  829931 p13 p33 300 N 
32.0000 M5  945131 p14 p33 300 N 
32.0000 M6  575923 p15 p32 300 N 
32.0000 M7  795971 p16 p39 300 N 
32.0000 M8  902337 p17 p37 300 N 
32.0000 M9  771601 p18 p34 300 N 
32.0000 M10 506241 p19 p31 300 N

2.2 源代码

其实代码还是比较简单,继承MessageEventGenerator,重写nextEvent()方法。源代码如下:

public class EachToOneMessageGenerator extends MessageEventGenerator {
    private int nextFromOffset; //next index to use from the "from" range

    ...

    @Override
    public ExternalEvent nextEvent() {
        int responseSize = 0; /* no responses requested */
        int msgSize;
        int interval;
        int from;
        int to;

        from = this.hostRange[0] + nextFromOffset;
        to = drawToAddress(hostRange, from);


        msgSize = drawMessageSize();
        MessageCreateEvent mce = new MessageCreateEvent(from, to, getID(),
                msgSize, responseSize, this.nextEventsTime);

        if ((this.hostRange[0] + nextFromOffset) == (this.hostRange[1]-1)) {
            /*** move to next interval ***/
            interval = drawNextEventTimeDiff();
            this.nextEventsTime += interval;
            this.nextFromOffset = 0;
        } else {
            this.nextFromOffset++;
        }

        if (this.msgTime != null && this.nextEventsTime > this.msgTime[1]) {
            this.nextEventsTime = Double.MAX_VALUE;  //next event would be later than the end time
        }

        return mce;
    }
}

3. 讨论

细心的你,会发现,上述代码产生的消息都是在同一个时间产生的,更加合理的做法是每个host都是独立的,即每个host都是每隔interval(如从[25, 35]随机选取)产生一个消息。如果您有思路,期待与我分享。

事实上,消息事件产生器对应于网络的data traffic models,最近在想,什么样的data traffic models才是更合理的,这多半取决于应用,那么应用与data traffic models是怎么对应的,在找这方面的资料,但没什么收获,求分享。

本文系Spark & Shine原创,转载需注明出处本文最近一次修改时间 2022-03-27 15:25

results matching ""

    No results matching ""