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网络编程

Download history 59/week @ 2024-04-18 73/week @ 2024-04-25 38/week @ 2024-05-02 41/week @ 2024-05-09 58/week @ 2024-05-16 72/week @ 2024-05-23 67/week @ 2024-05-30 43/week @ 2024-06-06 54/week @ 2024-06-13 81/week @ 2024-06-20 36/week @ 2024-06-27 32/week @ 2024-07-04 53/week @ 2024-07-11 674/week @ 2024-07-18 566/week @ 2024-07-25 306/week @ 2024-08-01

1,604 每月下载量
用于 16 个crate(14个直接使用)

MIT 许可证

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