Nacos源码学习系列服务端第13篇udp推送与ack机制

UdpConnector 基本属性pubic class UdpConnector { //存储要发送的数据和key //创建发送任务时塞入ackmap //直到以下情况发送会从map移除 //1、收到客户端的ack 2、重试已达最大次数 3、发送出现异常 private final ConcurrentMap<String, AckEntry> ackMap; //ackkey <-> 回调对象(包括有成..
摘要由CSDN通过智能技术生成

目录

udp推送服务类(UdpPushService)

UDP推送渠道(UdpConnector )

初始化UDP接收者

 发送数据

 异步发送

 失败重试

 总结


学习目标:通过本章节的学习,要了解两种推送方式的区别、回调的内部实现和回调结果的处理时机以及失败重试的内部实现是怎么样的。

udp推送服务类(UdpPushService)

public class UdpPushService implements ApplicationContextAware, ApplicationListener<ServiceChangeEvent> {
    //提供同步和异步的udp发送功能
    //提供可回调和重试 也可提供不可靠的发送功能    
    private final UdpConnector udpConnector;


    /**
     * Push Data without callback.
     *
     * @param subscriber  subscriber
     * @param serviceInfo service info
     */
    public void pushDataWithoutCallback(Subscriber subscriber, ServiceInfo serviceInfo) {
        String serviceName = subscriber.getServiceName();
        try {
            //组装数据体
            AckEntry ackEntry = prepareAckEntry(subscriber, serviceInfo);
               ....
            udpConnector.sendData(ackEntry);
        } catch (Exception e) {
        }
    }
    
    /**
     * Push Data with callback.
     *
     * @param subscriber   subscriber
     * @param serviceInfo  service info
     * @param pushCallBack callback
     */
    public void pushDataWithCallback(Subscriber subscriber, ServiceInfo serviceInfo, 
         PushCallBack pushCallBack) {
        String serviceName = subscriber.getServiceName();
        try {
            AckEntry ackEntry = prepareAckEntry(subscriber, serviceInfo);
            udpConnector.sendDataWithCallback(ackEntry, pushCallBack);
        } catch (Exception e) {
           ....
        }
    }

 
    private AckEntry prepareAckEntry(Subscriber subscriber, ServiceInfo serviceInfo) {
        InetSocketAddress socketAddress = new InetSocketAddress(subscriber.getIp(), 
             subscriber.getPort());
        long lastRefTime = System.nanoTime();
        return prepareAckEntry(socketAddress, 
                 prepareHostsData(JacksonUtils.toJson(serviceInfo)), lastRefTime);
    }
    
    private static AckEntry prepareAckEntry(PushClient client, Map<String, Object> data, 
             long lastRefTime) {
        return prepareAckEntry(client.getSocketAddr(), data, lastRefTime);
    }
    
    //设置lastRefTime属性根据ip port 构成AckEntry 的key
    //
    private static AckEntry prepareAckEntry(InetSocketAddress socketAddress, Map<String, 
           Object> data, long lastRefTime) {
        data.put("lastRefTime", lastRefTime);
        String dataStr = JacksonUtils.toJson(data);
       ....
       // 把map转成bytes
            byte[] dataBytes = dataStr.getBytes(StandardCharsets.UTF_8);
            dataBytes = compressIfNecessary(dataBytes);
            return prepareAckEntry(socketAddress, dataBytes, data, lastRefTime);
        ....
    }
    
    private static AckEntry prepareAckEntry(PushClient client, byte[] dataBytes, 
                 Map<String, Object> data,
            long lastRefTime) {
        return prepareAckEntry(client.getSocketAddr(), da
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值