`
zouzhirong
  • 浏览: 6003 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

延时事件轮询方案

    博客分类:
  • java
阅读更多
需求:
策略类游戏中,后台自动实时结算战斗等延时事件。
特征:用户提交延时事件,后台需要在延时事件时间到时立刻执行事件。


分析:

一:扫描策略

(1) 时间步长,查找范围(lastTime, lastTime + stepTime], 通过控制stepTime大小来限制数据量。
优点: 用时间戳当边界,简单易实现
缺点: 当延时事件稀疏时,经常会出现空数据,必须一步一步的轮询,性能低。

(2) limit限制,查找范围(lastTime, stopTime] limit size,通过控制limit大小来限制数据量。
优点: 每次查询有效率高,只要有数据就可以立即获取。
缺点: 用limit之后,就会出现时间戳分页边界问题。


二:问题总结(选择扫描策略:limit限制):

(1)轮询事件和注册延时事件线程不同步问题(多线程顺序不确定性、网络不稳定)
a、在now时刻,程序准备注册延时事件发生时间为now + delay
b、轮询线程轮询(tiem0, now + advance], advance为提前获取事件的时间,如果advance为0,表示只查询已经发生的事件。
c、将发生时间为now + delay的事件写入数据库
如果now + advance >= now + delay,即事件延时的时间小于轮询提前的时间,则会出现此事件丢失的问题。
解决方法:
a、保证advance <= 事件最小delay,同时写延时事件到数据库时,不用“set time=时间戳”的形式,而是用“set time=now() + delay”的形式,就可以忽略从java程序到写入数据库的时间误差。
b、增加自增字段id,多查询一次丢失事件:time <= now + advance && id > 已轮询的最大id


(2)limit时间戳分页边界问题
例如:有如下延时事件:
时间戳 事件
1 1
2 2
3 3
4 4
5 5
5 6
5 7
5 8
5 9
5 10
当查询时间戳在范围(0,5]内limit 8时,会检索得到事件1-8,但是事件9-10的时间戳也是5,故如果下次查找范围为(5,10]时,就会丢失事件9-10.
解决方法:
a、用java实现边界去重
查询(0,5]后,保留第5毫秒的所有事件id,接下来继续查询[5, 10]的事件,将两个查询中第5毫秒的事件做去重。
这样做有一个问题,如果第5毫秒的事件总数>= limit, 则取到第5毫秒时,每次获得的都是第5毫秒的事件,然后去重,出现死循环。
解决这个问题的方法的是主查询继续查询(5,10],另起一条sql查询第5毫秒的事件然后去重。
b、用自增字段id做边界
执行查找(5, 10] or (time=5 && id > 第5毫秒中上次查询的最大id) order by time, id
也可以将边界查找用另一个sql实现,变成两条sql:
select * from table where time > lastTime && time <= stopTime
select * from table where time = lastTime && id > 上次查询结果中时间戳为lastTime的事件最大id
c、将时间戳变成唯一id,即将时间戳 + 其他信息 -> 组合(各占多少位)到一个long型字段中做唯一时间有序id

0
2
分享到:
评论

相关推荐

    单片机 程序架构 时间片轮询. 时间片轮询..pdf

    每个任务执行完成后,通过延时函数或定时器中断来控制任务之间的切换,确保每个任务都能在其对应的时间片内得到执行。 4. **调试与优化**:通过对程序的实际运行情况进行监控和测试,调整各个任务的时间片长度,直至...

    西门子S7-1200PLC MODBUS通讯协议轮询的探讨.pdf

    对于通讯轮询时出现的异常,需要设计合适的检测机制,避免轮询过程出现中断或卡死。异常检测需要能够应对设备在启动时发送的非标准MODBUS报文,这些报文会导致PLC执行错误或者校验失败。 对于程序的扩展性,设计时...

    高效延时队列的设计与实现

    4. Redis实现:利用其有序集合(ZSet)存储消息,设置score为当前时间加延时时间,通过定时器轮询并消费已过期的消息。 5. 时间轮(Time Wheel):这是一种高效的数据结构,通过环形队列和定时器实现,将任务分配到...

    基于自相似业务流的AOS延时累积调度算法

    4. 提出的基于AOS延时累积自适应轮询(SDAAP)的新调度算法:文档提出了一种新的调度算法,即基于AOS延时累积自适应轮询(SDAAP)的调度算法。这种算法通过引入Hurst参数、紧急度、流量偏差和帧时间因子,动态地调整...

    使用Redis实现延时任务的解决方案

    尽管JDK的DelayQueue和MySQL轮询方案各有优缺点,但在需要高性能、高可靠性和数据持久化的场景下,Redis解决方案更为合适。在实际应用中,需要根据业务需求和资源限制选择最适合的方案,并考虑优化措施以提升系统的...

    互联网延迟队列解决方案设计.pdf

    1. 基于编程语言的解决方案:这种方案通常使用编程语言中提供的定时器、延时队列等组件。例如,Java中的Timer和DelayQueue,可以实现简单的延迟任务。但这种方法一般适用于单机场景,因为它难以应对分布式系统中的...

    JAVA 实现延迟队列的方法

    该方案的优点是简单实用,一针见血,但是缺点是单个 zset 肯定支持不了太大的数据量,且定时器轮询方案可能会有异常终止的情况需要自己处理,同时消息处理失败的回滚方案也需要自己处理。 2. RabbitMQ 队列方案 ...

    抄答案就是了,两套详细的设计方案,解决头疼的支付掉单问题.docx

    - **支付请求与响应**:流程与定时轮询方案相似。 - **记录掉单**:不同之处在于,此时不是将记录直接插入掉单表,而是发送一条掉单消息至延迟队列。 - **消息处理**:延迟队列按照预设的延迟时间发送掉单消息给补单...

    stm32f103使用SysTick实现us微妙级延时

    然而,在实现微妙延时时,我们通常并不需要中断功能,而是通过轮询SysTick的状态来计算时间。 首先,为了启用SysTick,我们需要配置系统控制寄存器(System Control Register, SCB),特别是其SYSCLK配置域。这包括...

    1分钟实现“延迟消息”功能

    传统的实现方式往往是通过定时任务(Cron Job)来轮询数据库,检查是否有满足条件的数据并进行处理。然而,这种方式存在明显的缺点,包括轮询效率低下、重复计算以及较差的时效性等问题。 #### 二、延迟消息功能的...

    延时队列我在项目里是怎么实现的?.doc

    在Redis中,可以利用有序集合(zset)来实现延时队列,通过定时任务(Timer)轮询zset,检查并处理已到达执行时间的消息。另一种方式是利用Redis的key过期回调机制,将消息的执行时间设为key的过期时间,key过期时...

    单片机增量式旋转编码器解码方案及设计要点

    首先,单片机的解码方案可以分为中断解码和主程序轮询解码两种。 1. 中断解码: 中断解码是将编码器的输出直接连接到单片机的外部中断引脚。当编码器的输出信号发生变化时,单片机通过中断服务程序来识别这些变化...

    test_delay.zip

    描述中提到,开发者在使用STM32CubeMX配置工具时遇到了微妙级延时的困扰,但最终找到了一种可行的解决方案,即通过通用定时器来实现。 STM32CubeMX是ST公司推出的一款强大的代码生成工具,它能够自动配置微控制器的...

    Go-delay-queue基于Redis实现的延迟队列

    总的来说,这个Go延迟队列项目结合了Go语言的并发优势和Redis的数据结构特性,提供了一种灵活、可扩展的解决方案,适用于各种需要延迟处理任务的场景。对于希望深入理解延迟队列或者在自己的项目中应用延迟队列的...

    C++精确定时定时器例子

    ### C++精确定时定时器实现方法解析 #### 背景与意义 在工业生产控制系统及实时数据处理系统中,精确定时是一项至关...总之,在实际开发过程中,开发者应当根据项目需求权衡各种方法的利弊,选择最合适的实现方案。

    使用Kotlin+RocketMQ实现延时消息的示例代码

    这些场景对应的解决方案,包括: 轮询遍历数据库记录 JDK 的 DelayQueue ScheduledExecutorService 基于 Quartz 的定时任务 基于 Redis 的 zset 实现延时队列。 除此之外,还可以使用消息队列来实现延时消息,...

    一种在UCOS下的按键解决方案

    为解决这个问题,我们通常采用软件延时或硬件电路来消除抖动。在UCOS环境下,可以创建一个定时任务,当检测到按键按下后,等待一小段时间(如20ms)再确认按键状态,如果状态保持不变,则认为是稳定的按键事件,避免...

    基于缓存共享的分布式宽带数字接收技术.pdf

    该方案结合了缓存共享技术和流控式轮询机制,以提高系统的处理能力和效率。 在传统的数字接收系统中,信号处理的带宽能力有限,通常只能够处理单一类型的信号,对于复杂多变的电磁环境的适应性较差。而宽带数字接收...

Global site tag (gtag.js) - Google Analytics