美文网首页
Lua App中通过Sqlite实现消息队列(异步通信)

Lua App中通过Sqlite实现消息队列(异步通信)

作者: LastKnight | 来源:发表于2017-03-16 20:56 被阅读0次

实践动机和目标

目前具有社交功能的App中大量使用本地Sql来存储用户记录,同时为了优化用户体验,这些App都愿意提供用户在无网(或弱网)环境下操作的需求。因此,在App中有必要有异步通信机制来处理(响应)用户的请求。

实现原理

1.通过在Sqlite中设立事件表(EventTable),来记录用户操作信息。

2.借由Lua提供的协程来处理用户请求,并向服务器发送请求。

3.完成与服务器的一次响应事件后,删除这一条操作事件。

建立事务表

在Sqlite中建立事务表,建议在表中设立一个时间戳类型的字段(EventDate)。采用时间戳类型的字段主要有两个目的:

1.作为事件的唯一标识符

2.时间戳类型本身可以作为字段进行排序

由此联想:Sqlite本身对每一行数据都会设置一个id,能否利用这个字段进行排序?

获取队列

队列的必要特性就是先进先出,那么就要在sql语句中实现。代码如下:

select * from EventTable order by EventDate ASC limit 1

order by EventDate ASC 按照EventDate对EventTable事件表进行正序排序

limit 1 取顶部第一条数据

设置Lua线程

Lua语言本身提协同程序处理,创建协程代码:

function  syncService(...)

       while true do

              -- [[ 处理内容 ]] --

              sleep(1)

       end

end

local syncData = coroutine.create(syncService)

functiononReady(...)

         coroutine.resume(syncData)

end

完善处理内容

在处理内容中可以完成API请求,在这个步骤中可以做以下配置:

设定一个全局变量 local sync = true

方法体中依次完成队列获取、调取API、删除队列(释放):

local sync = true--全局变量

if sync then

      local data =  dbHelper.execTable("select*fromEventTableorderbyEventDateASClimit1", "select”)

      if data and #data >0 then 

             if data[1] and data[1].EventDate then

                    sync =false

                    local response = post( ) --调取API,这里做了简略

                    if response ==200 then

                           dbHelper.execTable("delete from EventTable where EventDate = '"..data[1].EventDate.."'","delete") --释放队列            

                           sync =true

                    else 

                           sync =true

                    end

            end

      end

end

以上就是利用Lua来实现消息队列的基本思想

思考:调取线程中使用while死循环是否可取,有无更好的替代方案?

相关文章

  • Lua App中通过Sqlite实现消息队列(异步通信)

    实践动机和目标 目前具有社交功能的App中大量使用本地Sql来存储用户记录,同时为了优化用户体验,这些App都愿意...

  • spring boot 进阶(二)springBoot整合Rab

    在我们大多应用中,都可以通过消息服务中间件来提升系统异步通信,扩展解耦能力。 同步/异步 因为消息队列一般都是异步...

  • 用Redis实现的各种队列比较

    异步消息队列 通过list实现,rpush/lpop或者lpush/rpop 队列为空的处理: 通过程序sleep...

  • 消息队列入门

    概念 大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力 消息服务中两个重要概念: 消息队列主要有两...

  • PHP进程间通信--消息队列

    前面介绍了怎么通过消息管道(有名消息管道)进行进程间通信,下面介绍如何通过消息队列实现进程间通信。 首先我们来看一...

  • 消息队列中间件(一)介绍

    消息队列介绍 消息队列中间件是大型系统中的重要组件,已经逐渐成为企业系统内部通信的核心手段。它具有松耦合、异步消息...

  • 消息队列、消息中间件MQ的基本介绍

    消息队列介绍   消息队列中间件是大型系统中的重要组件,已经逐渐成为企业系统内部通信的核心手段。它具有松耦合、异步...

  • 消息队列

    定义 · 官方定义:消息队列是一种异步的服务间通信方式,是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量...

  • MQ快速理解

    RabbitMQ快速理解 什么是 MQ 消息队列中间件 实现接收和发送的异步解耦 真正的目的是为了通信(为什么)—...

  • RabbitMq

    1. 消息队列 消息队列中间件是分布式系统中重要组件,主要解 决应用耦合,异步消息,流量消锋等问题。实现...

网友评论

      本文标题: Lua App中通过Sqlite实现消息队列(异步通信)

      本文链接:https://www.haomeiwen.com/subject/nofsnttx.html