当前位置: 首页 > 知识库问答 >
问题:

客户端到服务器的同步调用和微服务之间的异步调用

严宇
2023-03-14

关于是否使用RMQ / Kafka / Http等进行微服务之间通信的讨论,我有点不知所措。我希望对此有所了解。首先,我的客户端是一个移动应用程序,它进行同步调用并等待响应。

凭直觉,我不希望java服务器和Python分类器之间的内部通信是同步的,因为我希望有高吞吐量,因为我可以让数千或数百万(希望如此)客户机同时发送请求。

如何进行非阻塞请求-响应,并将请求检索到同一客户端?

客户

共有2个答案

益炜
2023-03-14

如果你的目标是非阻塞扩展解决方案,我建议使用Kafka作为服务器和客户端之间的中间层。
通过这种方式,客户端向kafka发送同步请求,并等待服务器响应。
同时,服务器运行消费者的多线程系统,轮询(即消费)用户请求并向客户端发送响应。

因此,假设客户端Bob发送了一个请求,它在一个专门的kafka主题中排队,有数百万其他用户请求等待响应。< br >服务器在高负载下处理所有请求,最终到达Bob的事件,并最终在5秒钟后发送响应,现在Bob收到了响应,并可能关闭该请求的“会话”(没有像HTTP这样的实际会话,而是您选择的其他压缩/编码格式)。< br >在选择活动的形式和详细的沟通方式时,您应该考虑一些安全措施,因为您的问题比较基础,所以我们稍后再讨论这个问题。

涂羽
2023-03-14

从你发布的问题中,我想到的是,也许你可以在两者之间添加一层缓存。此缓存将在应用程序启动后立即预加载一些数据(取决于您可以承受的内存大小)。您可以有一个限时缓存或LRU(取决于您的体系结构)。Redis提供了简单有效的方法来实现这一点。这里唯一浪费的时间是网络延迟。注:我是这个平台的新手,目前正处于回答的初始阶段。因此,如果有任何改进建议,我们将不胜感激。谢谢

 类似资料:
  • 异步Mysql客户端 AsyncMysql::query($sql, $usePool = true) 第二个参数设为false将不会使用连接池中的资源,默认都会从连接池中取,配置连接池数量 => config/database.php 具体使用 use AsyncMysql; //设置超时时间 AsyncMysql::setTimeout(2); $res = (

  • 异步Redis客户端 连接池(连接池默认开启) use AsyncRedis; //关闭连接池 AsyncRedis::enablePool(false); //开启连接池 AsyncRedis::enablePool(true); 使用AsyncRedis use AsyncRedis; //设置超时时间 AsyncRedis::s

  • 异步Http客户端 Get方式 1.使用域名形式 use AsyncHttp; //直接使用域名, get方式 $http = new AsyncHttp('http://groupco.com'); //设置2s超时 $http->setTimeout(2); //$http->setCookies(['token' => 'xxxx']);

  • 异步Tcp客户端 串行发包 use AsyncTcp; $tcp = new AsyncTcp('127.0.0.1', 9501); $tcp->setTimeout(2); //串行发送 $res = (yield $tcp->call('hello server!')); $res = (yield $tcp->call('hello serv

  • 我到处都读到微服务中的服务对服务调用应该是异步的。当请求必须通过2个或多个异步服务时,我们如何进行客户端确认? 这是我的实时场景。我们正在我们的组织中开发电子邮件发送功能。我们计划按以下顺序为此提供4个API服务。 公共API-将电子邮件功能公开给公共 验证API-验证电子邮件和其他字段的真实性 模板获取API-从数据库/CMS中获取电子邮件模板并准备要发送的最终内容 电子邮件发送API-将接收收

  • 主要内容:1.概述,2. 消费者调用服务,3. 提供者提供服务1.概述 在 dubbo:// 协议的调用,一共分成三种: sync 同步调用 async 异步调用 oneway 单向调用 前两种比较好理解,都是基于 Request Response 模型,差异点在异步调用,服务消费者不阻塞等待结果,而是通过回调的方式,处理服务提供者返回的结果。 最后一种,基于 Message 模型,发起调用,而不关注等待和关注执行结果。 因此,从性能上:oneway > a