Redis+Kafka异步提高并发
Redis+Kafka异步提高并发
- Redis+Kafka异步提高并发
- 设计
- 实现
- 提交请求接口
- Kafka消费队列
- 异步处理Service
- 客户端轮询获取结果
- Redis集群节点配置
- KafKa集群节点配置
- 压力测试
Redis+Kafka异步提高并发
我们平时开发的后台接口,如果不优化,比如加缓存,异步等,接口并发量很难上得来,因为业务逻辑处理需要时间,后面的请求都在排队,时间一长就都超时了,这就是压力测试经常遇到的问题。简单说就是并发量上不来,那如何提高并发呢。
设计
提高并发通常有几个步骤,而且是循序渐进的。通常我是按如下几个点来优化并逐步测试。
1.优化我们的基本代码
如循环体内多次与数据库交互,涉及查询和修改,这种肯定需要先优化掉,基本原则就是,尽量减少循环体内与数据库交互的次数
2.加缓存,一般如Memcache, Redis
加缓存的目的也是尽量减少与数据库交互的次数
3.异步处理
使用消息队列MQ,将接收到的请求放入队列,然后马上返回给客户端,再由异步线程来处理队列。
基于以上的优化思路,不想提升并发量都难啊。
实现
这里重点介绍下redis+kafka实现异步
提交请求接口
Controller将客户端请求参数放入KafKa队列,参数校验在Controller层完成。并清理redis缓存,标记Redis队列处理未完成,然后返回给客户端。
客户端收到反馈,但并没有获取到结果数据,这时可以尝试轮询获取结果,因为后台结果正在异步处理中
Kafka消费队列
KafKa消费者线程,消费到指定的topic,获取我们放入队列的请求参数,开始调用Service异步处理
异步处理Service
需要注意:异步处理的耗时问题,如果处理时间太长,队列消费会出现堆积现象,要想办法提高队列处理速度,才能从根本上提高并发。
提高队列的处理速度,无外乎上面提到的基本代码优化和缓存
客户端轮询获取结果
提交请求后,因为后台立即返回接收数据成功,所以前端需要间隔轮询获取打卡结果,比如1秒请求一次循环10次还拿不到结果,说明后台队列处理失败了
Redis集群节点配置
redis:
cluster:
max-redirects:
# 集群节点
nodes: xxx.xxx.xxx.xx1:6378, xxx.xxx.xxx.xx1: 6379, xxx.xxx.xxx.xx2: 6378, xxx.xxx.xxx.xx2: 6379, xxx.xxx.xxx.xx3: 6378, xxx.xxx.xxx.xx3: 6379
# 密码
password: xxxxxx
# ssl
ssl: false
jedis:
pool:
max-active: -1
max-idle: 8
max-wait: -1
min-idle: 0
timeout: 10000
KafKa集群节点配置
kafka:
bootstrap-servers: xxx.xxx.xxx.xxx:9092, xxx.xxx.xxx.xxx:9092, xxx.xxx.xxx.xxx:9092
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
group-id: check-consumer-group-prd
enable-auto-commit: false
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
listener:
concurrency: 6
我们生产服务器都是双节点,这里Kafka消费者单个节点配置的是6个消费者,总共是12个消费者线程同时消费队列
压力测试
压力测试使用Jemter
作者介绍:小林,狐小E资深开发工程师,专注移动协同办公平台的SAAS软件开发以及轻应用开发
最近开发了一款移动办公软件狐小E
Redis+Kafka异步提高并发的更多相关文章
- Kafka在高并发的情况下,如何避免消息丢失和消息重复?kafka消费怎么保证数据消费一次?数据的一致性和统一性?数据的完整性?
1.kafka在高并发的情况下,如何避免消息丢失和消息重复? 消息丢失解决方案: 首先对kafka进行限速, 其次启用重试机制,重试间隔时间设置长一些,最后Kafka设置acks=all,即需要相应的 ...
- Kafka 异步消息也会阻塞?记一次 Dubbo 频繁超时排查过程
线上某服务 A 调用服务 B 接口完成一次交易,一次晚上的生产变更之后,系统监控发现服务 B 接口频繁超时,后续甚至返回线程池耗尽错误 Thread pool is EXHAUSTED.因为服务 B ...
- PHP写的异步高并发服务器,基于libevent
PHP写的异步高并发服务器,基于libevent 博客分类: PHP PHPFPSocketLinuxQQ 本文章于2013年11月修改. swoole已使用C重写作为PHP扩展来运行.项目地址:h ...
- iOS GCD基础篇 - 同步、异步,并发、并行的理解
1.关于GCD - GCD全称是Grand Central Dispatch - GCD是苹果公司为多核的并行运算提出的解决方案 - GCD会自动利用更多的CPU内核(比如双核.四核) - GC ...
- 使用生成器把Kafka写入速度提高1000倍
title: 使用生成器把Kafka写入速度提高1000倍 toc: true comment: true date: 2018-04-13 21:35:09 tags: ['Python', '经验 ...
- redis 初步认识四(redis锁,防并发)
using System; namespace ConsoleAppRedis { class Program { static void Main(string[] args) { //第一种,无登 ...
- SQL Server数据库读写分离提高并发性
在一些大型的网站或者应用中,单台的SQL Server 服务器可能难以支撑非常大的访问压力.很多人在这时候,第一个想到的就是一个解决性能问题的利器——负载均衡.遗憾的是,SQL Server 的所有版 ...
- redis实现异步任务队列
redis实现异步任务队列 先说思路: 将任务对象序列为JSON字符串,然后推入REDIS缓存,这叫入队. 通过独立的工作线程从REDIS拉出一个任务,这叫出队,工作线程将JSON字符串还原为任务对象 ...
- STM 软件事务内存——本质是为提高并发,通过事务来管理内存的读写访问以避免锁的使用
对Java程序员来说,我们对面向对象的编程(OOP)自然都是烂熟于胸的,但语言也极大地影响了我们构建面向对象应用程序的方式.(现在的OOP已经和Alan Kay当初创造这个词时候的初衷大不相同了,他的 ...
随机推荐
- PDOStatement::columnCount
PDOStatement::columnCount — 返回结果集中的列数.(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0) 说明 语法 int PDOStateme ...
- CF R 630 div2 1332 F Independent Set
LINK:Independent Set 题目定义了 独立集和边诱导子图.然而和题目没有多少关系. 给出一棵树 求\(\sum_{E'\neq \varnothing,E'\subset E}w(G( ...
- linux的软件管理的rpm包和yum配置加tar解压包和安装编译./configuer
软件管理 rpm包 和yum 1.软件形式 Linux系统的第三方软件,无论是应用软件还是工具软件,大多以以下两种形式之一发行: 源代码形式 预编译形式 获取的源代码形式的软件,需要对其 ...
- 使用hibernate validate做参数校验
1.为什么使用hibernate validate 在开发http接口的时候,参数校验是必须有的一个环节,当参数校验较少的时候,一般是直接按照校验条件做校验,校验不通过,返回错误信息.比如以下校验 ...
- day2. 六大基本数据类型简介
一.基本数据类型 Number 数字类型 (int float bool complex) str 字符串类型 list 列表类型 tuple 元组类型 set 集合类型 dict 字典类型 二.Nu ...
- python range函数的用法
range 函数是Python内置函数.可创建一个整数列表,一般用在 for 循环中. 函数语法:range(start, stop[, step]) start: 计数从 start 开始.默认是从 ...
- Python接口自动化测试框架: pytest+allure+jsonpath+requests+excel实现的接口自动化测试框架(学习成果)
废话 最近在自己学习接口自动化测试,这里也算是完成一个小的成果,欢迎大家交流指出不合适的地方,源码在文末 问题 整体代码结构优化未实现,导致最终测试时间变长,其他工具单接口测试只需要39ms,该框架中 ...
- Bytom 储蓄分红 DAPP 开发指南
储蓄分红DAPP 储蓄分红合约简介 储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润.用户可以在 ...
- 微信小程序多列选择器
wxml <picker mode="multiSelector" bindchange="bindMultiPickerChange2" bindcol ...
- tableau用户分类
1.观察消费金额的分布 直接[消费金额]直方图趋势不明显的时候,可以考虑将金额对数化处理 这样看起来就近似个正态分布了 2.怎么看超市卖的最好的产品 更深层次的分析怎么做呢? 这个聚合字段在数据源不会 ...