10个版本 (4个重大变更)
0.5.0 | 2024年7月22日 |
---|---|
0.4.1 | 2024年7月22日 |
0.3.1 | 2024年1月24日 |
0.3.0 | 2023年12月28日 |
0.1.1 | 2023年11月17日 |
#692 在 网络编程
1,604 每月下载量
用于 16 个crate(14个直接使用)
475KB
10K SLoC
网络分为2部分
- 网络和路由表
- 自定义行为
网络和路由表
这部分处理网络和路由表。路由表的逻辑不是固定的,而是通过trait RoutingTable注入,该trait提供了以下功能:
pub trait RouterTable: Send + Sync {
fn path_to_node(&self, dest: NodeId) -> RouteAction;
fn path_to_key(&self, key: NodeId) -> RouteAction;
fn path_to_service(&self, service_id: u8) -> RouteAction;
fn path_to(&self, route: &RouteRule, service_id: u8) -> RouteAction {
match route {
RouteRule::Node(dest) => self.path_to_node(*dest),
RouteRule::Closest(key) => self.path_to_key(*key),
RouteRule::Service => self.path_to_service(service_id),
}
}
}
顺便说一下,网络提供了一些基本的发送和处理消息的功能
- 通过NodeId发送到其他节点
- 发送到由service_id标识的服务器所服务的其他节点
- 发送到本地节点
通过路由表和传输发送消息到其他节点
自定义行为
通过提供自定义行为,我们可以以模块化的方式向应用程序添加逻辑,每个模块都需要定义一些部分
- 行为:定义主要逻辑(这是行为的核心),处理一些主要事件,如:新建立的连接、连接断开等
- 连接处理程序:定义与每个连接分离的逻辑,如:连接事件、传输消息等
每个部分也可以通过使用在函数处理程序中提供的Agent与其他部分交换数据
- 从行为到每个连接
- 从每个连接返回到行为
- 从每个连接到每个其他连接
以下是行为的trait
pub trait NetworkBehavior<BE, HE, MSG>
where
MSG: Send + Sync,
{
fn service_id(&self) -> u8;
fn on_tick(&mut self, agent: &BehaviorAgent<HE, MSG>, ts_ms: u64, interval_ms: u64);
fn check_incoming_connection(
&mut self,
node: NodeId,
conn_id: ConnId,
) -> Result<(), ConnectionRejectReason>;
fn check_outgoing_connection(
&mut self,
node: NodeId,
conn_id: ConnId,
) -> Result<(), ConnectionRejectReason>;
fn on_incoming_connection_connected(
&mut self,
agent: &BehaviorAgent<HE, MSG>,
conn: Arc<dyn ConnectionSender<MSG>>,
) -> Option<Box<dyn ConnectionHandler<BE, HE, MSG>>>;
fn on_outgoing_connection_connected(
&mut self,
agent: &BehaviorAgent<HE, MSG>,
conn: Arc<dyn ConnectionSender<MSG>>,
) -> Option<Box<dyn ConnectionHandler<BE, HE, MSG>>>;
fn on_incoming_connection_disconnected(
&mut self,
agent: &BehaviorAgent<HE, MSG>,
conn: Arc<dyn ConnectionSender<MSG>>,
);
fn on_outgoing_connection_disconnected(
&mut self,
agent: &BehaviorAgent<HE, MSG>,
conn: Arc<dyn ConnectionSender<MSG>>,
);
fn on_outgoing_connection_error(
&mut self,
agent: &BehaviorAgent<HE, MSG>,
node_id: NodeId,
conn_id: ConnId,
err: &OutgoingConnectionError,
);
fn on_handler_event(
&mut self,
agent: &BehaviorAgent<HE, MSG>,
node_id: NodeId,
conn_id: ConnId,
event: BE,
);
fn on_rpc(
&mut self,
agent: &BehaviorAgent<HE, MSG>,
req: Req,
res: Box<dyn RpcAnswer<Res>>,
) -> bool;
}
以下是连接处理程序的trait
pub trait ConnectionHandler<BE, HE, MSG>: Send + Sync {
fn on_opened(&mut self, agent: &ConnectionAgent<BE, HE, MSG>);
fn on_tick(&mut self, agent: &ConnectionAgent<BE, HE, MSG>, ts_ms: u64, interval_ms: u64);
fn on_event(&mut self, agent: &ConnectionAgent<BE, HE, MSG>, event: ConnectionEvent<MSG>);
fn on_other_handler_event(
&mut self,
agent: &ConnectionAgent<BE, HE, MSG>,
from_node: NodeId,
from_conn: ConnId,
event: HE,
);
fn on_behavior_event(&mut self, agent: &ConnectionAgent<BE, HE, MSG>, event: HE);
fn on_closed(&mut self, agent: &ConnectionAgent<BE, HE, MSG>);
}
依赖项
~8–15MB
~210K SLoC