15.4.3. Flow Controllers
eProsima Fast DDS 提供了一种机制来限制 DataWriter 发送数据的速率。这些控制器应在创建 DomainParticipant 时使用 FlowControllersQos
注册,然后在创建 DataWriter 时通过 PublishModeQosPolicy
引用。
首次通过异步 DataWriter 引用流控制器时,将生成一个新线程。该线程将负责调节所有引用相同流控制器的 DataWriters 的网络输出样本。
流控制器应该有一个名称,以便稍后可以被 DataWriters 引用。始终可用的默认无限制 FIFO 流控制器名称为 FASTDDS_FLOW_CONTROLLER_DEFAULT
。
15.4.3.1. Scheduling policy
根据使用的调度策略,有不同类型的流控制器。它们都将限制在指定的时间段内发送到网络的最大字节数,即每个周期不超过 max_bytes_per_period
字节,在 period_ms
毫秒内。它们之间唯一的区别在于决定样本发送顺序的方法。
FIFO:按先到先服务的顺序输出样本。
ROUND_ROBIN:以循环顺序从每个 DataWriter 中输出一个样本。
HIGH_PRIORITY:优先输出具有最高优先级的数据写入器(DataWriters)的样本。DataWriter 的优先级通过属性
fastdds.sfc.priority
配置,允许值范围是 -10(最高优先级)到 10(最低优先级)。如果属性不存在,则会设置为最低优先级。同一优先级的数据写入器样本按照 FIFO 顺序处理。PRIORITY_WITH_RESERVATION:与上面的方法类似,但允许 DataWriters 保留部分输出带宽。通过属性
fastdds.sfc.bandwidth_reservation
来实现,允许值范围是 0 到 100,表示总流控制器限制的一定百分比。如果属性不存在,则默认为 0(不为 DataWriter 保留带宽)。在保留带宽消耗后,其余样本将按照 HIGH_PRIORITY 的规则处理。
15.4.3.2. Example configuration
以下是一个 C++ 示例配置:
// Limit to 300kb per second.
static const char* flow_controller_name = "example_flow_controller";
auto flow_control_300k_per_sec = std::make_shared<eprosima::fastdds::rtps::FlowControllerDescriptor>();
flow_control_300k_per_sec->name = flow_controller_name;
flow_control_300k_per_sec->scheduler = eprosima::fastdds::rtps::FlowControllerSchedulerPolicy::FIFO;
flow_control_300k_per_sec->max_bytes_per_period = 300 * 1000; // 每秒限制300KB
flow_control_300k_per_sec->period_ms = 1000; // 周期为1000毫秒
// [OPTIONAL] Configure sender thread settings
flow_control_300k_per_sec->sender_thread = eprosima::fastdds::rtps::ThreadSettings{-1, 0, 0, -1};
// Register flow controller on participant
DomainParticipantQos participant_qos;
participant_qos.flow_controllers().push_back(flow_control_300k_per_sec);
// .... create participant and publisher
// Link writer to the registered flow controller.
// Note that ASYNCHRONOUS_PUBLISH_MODE must be used
DataWriterQos qos;
qos.publish_mode().kind = ASYNCHRONOUS_PUBLISH_MODE;
qos.publish_mode().flow_controller_name = flow_controller_name;
警告
指定流控制器的大小小于传输缓冲区大小可能导致消息永远不会被发送。
内容由零声教学AI助手提供,问题来源于学员提问