个推延迟收到消息问题原因分析

1.    客户端断网,导致客户端和个推服务器之间长连接断掉,需要网络恢复后并且建立长连接时才能收到个推的透传,建立连接最快要2秒的时间。在网络时断时续的情况下要比http请求的响应慢的多。若出现网络通而不达的情况,90秒以后才能确定这种网络异常,而http请求一般在设置的超时的时间内就返回了超时的结果(http的超时的时间一般设置的是10秒或20米,默认时间是30秒)。

2.    个推服务器消息排队延迟。毕竟免费的个推是N多人用一个服务,传说6亿活跃用户就是用负载均衡调度的时间也不慢,更慢的是就给你的消息分配了处理服务器,那还要在这个服务器排很长的队,这就决定了它快不起来。当然管理这么巨大的消息队列也很艰巨。个推虽然做到了消息基本不漏发,但是它的代价也是超大的。这就造成了没有发送成功的需要重复多次发送和确认发送成功,让本来消息队列就超长的情况更糟糕,一般有新消息不断加入进来,又有发送失败的消息加入进来。这样就进一步增加了消息的延迟。并且这种消息发送失败不断循环发送的机制也造成了,它很容易遭到攻击,一旦个推服务器遭到攻击,会有更大量的消息步断涌入,造成消息的严重延迟。虽然个推做了这种恶意消息的自动检测机制,但是当发现后再处理也是需要时间的。上次由于个推的问题就造成,10分钟才绑定个推成功的情况,很多透传消息延迟好久。当然个推也有一个bundle Identifier每年2万元的付费服务,据说能够减少在第二个环节在分配到的服务器前排队的问题。但是调度的时间开销还是要负担的。个推客户说的一个付费的用户一个服务,具体如何也不太清楚,不过肯定不是一个用户一台电脑,而是像阿里云一样的域名服务器(它本来就叫云推送)。个推云推送的透传大多数的推送速度还是很快的,快过htttp请求的速度。显然很多app的用户互相踢出机制大都使用个推的透传或个推的远程推送(苹果APNS),发现帐户被在其它设备登录要比发http请求时发现更快和实时。对不稳定网络环境,晚上下班高峰使用云推送密集时间段,服务器被攻击时,消息延迟很严重。

3.    服务器和个推之间的网络异常,需要个推和服务器恢复时间,导致服务处理成功,但是消息却没有及时发送到服务器。

 

 

除了透传(常规长连接)另一个更大范围使用的远程推送。透传的好处是更及时,远程推送的好处是用户不启动应用也能被推送活动消息。

通过苹果的APNS(它是苹果服务器和开机的iphone建立的一个长连接,个推的远程推送最终也是通过APNS推送来实现),当然通过远程推送的消息速度比透传慢的多,好处是可以在用户不开启应用的情况下,可以给用户推广告信息,活动信息,大部分对实时要求不高的消息推送用的都是远程推送,几乎所有应用都开启了远程推送,并且大部分应用都是使用的是个推的远程推送,也有的是直接使用苹果APNS。苹果不支持透传。

若你的应用对个推很依赖,那么只能等个推绑定成功才能自动登录或登录了不幸的是,有时候个推绑定回来的消息很慢,那么职能等了,通常个推不能在2秒内绑成功,那么通常要等1分钟左右,少数异常情况要等3到10分钟。若登录时不等待个推绑定成功的小,若需要用到个推时,它不给你返回,那么你的业务可能异常(如你接个单,结果乘客立刻取消了订单,你个推还没建立好连接,那么你就要等它建立好才能收到了,那么你得到个推消息就及时了),若你等待它绑定成功再进入那么有几率进入漫长的登录等待过程。

 

个推是第三方做的,app是自己做的,你只能收这种消息,无法帮助他们处理各种异常,如:若发现网络异常或经常闪断是发送http请求来确认。所以要处理各种异常和确认,不绑定成功能够进入并且接单,收到实时推送消息,那么最好是不用个推,实现自己的长连接。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以用Java来写一个RocketMQ延迟消息的例子。首先,您需要配置RocketMQ的环境,然后创建一个Producer实例,并且设置消息的属性,将消息发送到指定的topic。在发送消息时,可以设置消息延迟时间,使用sendDelayMsg()方法,消费者将在指定的时间后收到消息。 ### 回答2: RocketMQ是一个开源的分布式消息队列系统,在实现延迟消息时可以使用RocketMQ提供的特性——延迟消息延迟消息是指在发送消息时可以指定该消息延迟时间,消息会在指定延迟时间之后才会被消费者消费。 要写一个RocketMQ延迟消息,首先需要搭建一个RocketMQ的环境,包括安装RocketMQ服务器和创建Producer和Consumer。然后,按照以下步骤实现延迟消息: 1. 创建Producer:在程序中创建一个RocketMQ的Producer对象,设置NameServer的地址,并启动Producer。 2. 创建延迟消息:使用Producer创建一个延迟消息,包括指定Topic和Tags,并在消息中设置延迟时间,单位为毫秒。 3. 发送消息:使用Producer发送延迟消息。 4. 创建Consumer:在程序中创建一个RocketMQ的Consumer对象,设置NameServer的地址和要消费的Topic,并启动Consumer。 5. 消费消息:Consumer会从RocketMQ服务器中拉取消息,当延迟时间到达时,消费者会收到消息并进行消费。 需要注意的是,RocketMQ的延迟消息有一定的误差,实际的延迟时间可能比设置的延迟时间要长。这是因为消息发送和消费都需要一定的时间,以及网络延迟等因素的影响。 总结起来,实现RocketMQ延迟消息需要搭建RocketMQ环境,创建Producer和Consumer,并在消息中设置延迟时间。通过这些步骤,即可实现RocketMQ延迟消息的功能。 ### 回答3: RocketMQ是一个分布式消息队列系统,可以实现可靠的消息传递和事务消息等。要写一个RocketMQ延迟消息,可以按照以下步骤进行: 1. 首先,确保已经正确设置了RocketMQ的环境和配置,并创建了所需的生产者和消费者。 2. 创建一个Topic(主题)和一个Tag(标签),以便将延迟消息发送到正确的目标。 3. 在生产者端创建消息,并设置延迟时间。可以使用`ScheduleMessage`类的`setDelayTimeLevel`方法来设置延迟级别,取值范围为1-18,代表延迟时间分别为1s、5s、1m、2m等。 4. 将设置好延迟时间的消息发送到指定的Topic和Tag。 5. 在消费者端,通过订阅指定的Topic和Tag,接收延迟消息。 6. 消费者接收延迟消息后,根据业务需求进行相应的处理。 需要注意的是,RocketMQ的延迟消息依赖于Broker的定时任务,默认会每隔1秒扫描所有的延迟消息发送。 综上所述,以上是一个简单的描述如何写一个RocketMQ延迟消息的步骤。具体实现时,需要按照RocketMQ的API文档和具体业务需求进行操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值