Giter Site home page Giter Site logo

Comments (12)

coolseven avatar coolseven commented on August 18, 2024

from notes.

MrKLL avatar MrKLL commented on August 18, 2024

from notes.

coolseven avatar coolseven commented on August 18, 2024

from notes.

MrKLL avatar MrKLL commented on August 18, 2024

from notes.

coolseven avatar coolseven commented on August 18, 2024

你可以尝试一下当订单生成之后主动向队列推送一条消息, 然后由队列的消费者去处理这个订单

而不是定时去扫描现有的所有订单

from notes.

MrKLL avatar MrKLL commented on August 18, 2024

我现在的做法貌似就是这样,我是订单任务都推到队列中,然后在消费者方法中取任务进行判断,没有达到某个点就用release(1)隔一秒继续执行,达到了就去平仓,删除任务,但是这样我看了一下,每秒就只能处理15个订单,而且我换成release(),每秒处理的也就是15单

from notes.

coolseven avatar coolseven commented on August 18, 2024

你可以把需求拆分成两个部分:
第一部分负责从找出达到平仓条件的订单, 并将达到平仓条件的订单推送到队列中
第二个部分负责处理达到平仓条件的订单

第一部分可以不用队列来做, 而是用常驻脚本来做,
该常驻脚本的伪代码如下:

while(true){
     // 从数据库或缓存中按照时间或者其他维度取出一定数量的订单
     $ordersToCheck = $this->queryOrders();
    
     // 从这些订单中过滤出达到平仓条件的订单
     $orders = $this->filterSuitableOrders($ordersToCheck) ;   

     foreach($orders as $order){
           // 将达到平仓条件的订单推送到 'close-position' 队列中, 由消费进程去进行平仓操作
           Queue::push($order, 'close-position');
     }
}

第二部分负责消费 'close-position' 队列中的订单

你可以找一下每秒处理15单的瓶颈在哪里,

  • 如果瓶颈在过滤出达到平仓条件的订单的话, 就优化第一部分的逻辑, 核心思路是并行过滤
    比如:
    每次将订单存储到缓存或者数据库时, 根据订单的某个特征,如 订单号的 前3位数字, 将订单存储到不同的缓存 list 里面 或者 不同的表里面
    然后, 针对每个 缓存 list , 或者针对每个表, 分别启动一个或多个常驻脚本, 这个常驻脚本负责从它对应的 缓存 list 或者 表里面进行扫描和过滤

  • 如果瓶颈在处理达到平仓条件的订单的话, 就增加 'close-position' 队列的消费进程数量

from notes.

MrKLL avatar MrKLL commented on August 18, 2024

from notes.

im55cc avatar im55cc commented on August 18, 2024

你好,我想请教一下,开启多个消费进程,任务不会重复消费的原理是什么?是因为redis的原子性么。

from notes.

coolseven avatar coolseven commented on August 18, 2024

你好,我想请教一下,开启多个消费进程,任务不会重复消费的原理是什么?是因为redis的原子性么。

获取一个待消费的任务的本质是调用 redis 的 pop() 方法得到一个 job payload
由于 redis 服务是单进程的, 所以即使多个消费进程同时调用 pop() 方法, 也不会得到重复的 job payload

from notes.

im55cc avatar im55cc commented on August 18, 2024

from notes.

Caesar0220 avatar Caesar0220 commented on August 18, 2024

你好我想请问一下。我创建multiTask的时候,taskA跟taskB都进入队列了,然后运行php think queue:work --queue multiTaskJobQueue的时候,第一次消费了TaskA,第二次消费了TaskB。但是命令行中并无输出。只有Processed: application\index\job\MultiTask@taskB这种提示,请问是什么原因?

from notes.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.