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

最新文章

  1. js正则表达式学习
  2. 3.python算法之完全数
  3. CSU 1116 Kingdoms(枚举最小生成树)
  4. JavaScript中回调函数的使用
  5. OpenERP 安装在Windows server上时间显示不对的解决办法
  6. PHP页面跳转代码
  7. 基于EF的数据外键关联查询
  8. Heroku 部署时 time out 错误,对GFW无力吐槽!!!
  9. CCI_chapter 8 Recurision
  10. ASP.NET MVC 部分视图(转)
  11. crontab的定时任务不能自动执行,但是手动执行脚本一直能成功
  12. CSS3学习系列之布局样式(一)
  13. 对HTML5标签的认识(四)
  14. ubuntu下 将证书导入java的cacerts证书库
  15. How to Reset VW Steering Assist 1S1909144P with OBDSTAR X300 DP
  16. spring boot+mybatis+mysql
  17. 深入浅出SharePoint2013——Search Schema配置
  18. 排序算法之堆排序(Heapsort)解析
  19. HTML小记
  20. Android - 资源(resource)转换为String

热门文章

  1. PHP date_default_timezone_set() 函数
  2. PHP fopen() 函数
  3. PDO::errorInfo
  4. 一些Tips
  5. IDEA新增类的快捷键
  6. “随手记”开发记录day01
  7. 一切尽在掌控之中:这个Python脚本,让工作自动向你汇报进度!
  8. Python数据类型-dic,set常见操作
  9. css笔记 定位的分类
  10. Zabbix5 对接 SAML 协议 SSO