币安API消息队列:订单流处理优化
5 个回答
针对币安API订单流数据堆积问题,我觉得是由于API 请求过于频繁触发限流所致。可以通过引入消息队列中间件(RabbitMQ、Kafka)对订单流进行缓存,并将对实时性依赖较高的业务逻辑拆分成异步任务。
使用多线程或者异步IO方式去调用API,批量的请求数据,然后一次性下单。还有就是在服务器上做个监控,看CPU、内存和网络带宽什么的。如果还有富裕的话就弄一个缓存层,把高频的数据存储在Redis里。
消息堆积一般是由于消费跟不上生产造成的,可以使用kafka或者rabbitmq等分布式消息队列提高消费并发度。同时检查api请求频率、业务处理逻辑等等是否会造成性能瓶颈,调整批量处理条数等等。如仍无解决办法,请提供系统架构说明。
消息堆积,大概率还是因为业务消息量过大,消费不及时导致的消息堆积,可以考虑以下几种方式来优化一下: 一是,看看消息中间件的配置,比如RabbitMQ、Kafka等,他们的参数配置是否合理,调整prefetch_count、批量消费等; 二是,梳理一下消费者的逻辑,查看是否有耗时操作,例如:频繁查询数据库、打印大量日志等,如果需要的话可以考虑异步的方式处理; 三是,消息分片,将订单流按照某个维度拆开(例如:交易对、用户ID等),让每个消费者只消费自己对应的一组消息,让系统能够并行化处理订单的消费。 以上是个人思考的一些问题点,可以尝试去解决一下,估计应该会有所收获。
原因: 订单的处理速度跟不上,一般有 2 种情况,要么是并发太高,要么是消费处理太慢。 异步处理:拆分多个消费者组,或者使用 Kafka/RabbitMQ 等性能更好的消息队列。 流控:不能让 API 被熔断。 数据过大:加入 Redis 堆栈,先存起来在处理。 需要根据服务的具体配置参数进行不断的调优
消息堆积:可以采用异步+批量消费,引入rabbitmq、kafka等中间件将订单分批,然后通过线程池来实现并发进行,同时还可以对db的插入进行优化,不要一次性全部插入。