如何在CloudSim/iFogSim中拒绝Cloudlet/Tuple?传感器请求拒方案咨询
在CloudSim/iFogSim中拒绝请求的解决方案
一、CloudSim中拒绝Cloudlet的方法
- 提交前拦截:生成Cloudlet后,先判断是否满足业务约束(如资源阈值、QoS要求等),不满足则不调用
DatacenterBroker.submitCloudlet(cloudlet),直接放弃该Cloudlet。 - 提交后终止:若Cloudlet已提交,可修改
Datacenter类的processCloudletSubmit()方法,加入约束检查逻辑,若不满足则发送CloudletReturnEvent,将Cloudlet标记为FAILED状态,终止后续调度流程。
二、iFogSim中拒绝Sensor生成的Tuple的解决方案
针对Sensor必须指定Tuple目的地的要求,可通过以下方式实现拒绝:
1. 自定义“丢弃节点”处理
- 创建一个仅用于接收并丢弃Tuple的FogNode实例,不配置计算资源,重写其
processTupleArrival()方法:
@Override protected void processTupleArrival(SimEvent ev) { Tuple tuple = (Tuple) ev.getData(); // 直接标记Tuple为已处理,不做转发或执行 tuple.setStatus(Tuple.Status.PROCESSED); // 不触发任何后续事件 }
- 在Sensor生成Tuple时,若检测到不满足约束,将Tuple的目的地设为该丢弃节点的ID。Tuple会被发送至该节点后直接丢弃,不会进入正常网络流转。
2. 在Sensor发送前拦截
- 扩展
Sensor类,重写sendTuple()方法,加入约束判断逻辑:
@Override public void sendTuple() { Tuple tuple = createTuple(); // 生成Tuple实例 if (!checkTupleConstraints(tuple)) { // 自定义约束检查方法 // 不满足约束,直接丢弃,不执行原发送逻辑 tuple.setStatus(Tuple.Status.DROPPED); return; } // 满足约束,执行父类发送逻辑 super.sendTuple(); }
即使Tuple指定了目的地,也不会被加入仿真事件队列,相当于在源头直接丢弃。
3. 网络层拦截丢弃
- 重写
Network类的sendTuple()方法,在发送前检查Tuple状态:
@Override public void sendTuple(Tuple tuple, int sourceId, int destId, double delay) { if (tuple.getStatus() == Tuple.Status.DROPPED) { return; // 标记为丢弃的Tuple直接跳过发送 } super.sendTuple(tuple, sourceId, destId, delay); }
配合Sensor的约束检查,生成不满足条件的Tuple时先标记为DROPPED,再指定任意合法目的地,后续网络层会自动拦截丢弃。
内容的提问来源于stack exchange,提问作者Mayssa Trabelsi
相关产品推荐
相关产品推荐

