Digital Ocean App:两个组件之间通过ZMQ进行通信

如何解决Digital Ocean App:两个组件之间通过ZMQ进行通信

总结

我尝试在 Digital Ocean 上构建应用程序。我选择了它的服务/产品“应用程序”。 我的应用程序由 3 个组件组成:

  • 服务:Flask 应用程序 + ZMQ 客户端(REQ 套接字)
  • Worker:ZMQ 服务器(REP 套接字)
  • Worker:ZMQ 客户端(REQ 套接字)

使用的语言是 Python。术语“服务”和“工作器”在 Digital Ocean 应用规范的上下文中。

预期行为

我尝试将请求从客户端组件发送到服务器组件(在收到响应之后)。

我希望这种情况:

  1. 服务器已启动,正在等待请求
  2. 客户端启动并发送请求
  3. 服务器接收请求
  4. 服务器发送响应
  5. 客户端收到响应

真实行为

它在第 3 步中断。这意味着服务器永远不会收到请求。 客户端和服务端都启动了,没有任何异常(通过日志确认)

我的尝试

  • 以不同的顺序启动/重启组件

  • 不同的端口号

  • 重命名组件(删除有问题的字符)

  • 将 ZMQ REQ 套接字连接到 localhost

  • 通过名称将 ZMQ REQ 套接字连接到 REP 组件(代码示例)

  • 在 App Spec yaml 文件中定义内部端口。只有服务才有可能。

Worker ZMQ 客户端

import time
import zmq
import logging

logging.basicConfig(level=logging.DEBUG)

try:
    zmq_context = zmq.Context()
    socket = zmq_context.socket(zmq.REQ)
    socket.connect("tcp://ZMQServer:55555")

    for i in range(5):
        logging.debug(f"[CLIENT] Sending request {i}")
        socket.send_string("test")
        time.sleep(1)
        logging.debug(f"[CLIENT] Waiting for a response {i}")
        message = socket.recv_string()
        logging.debug("[CLIENT] Response received")
except Exception as e:
    logging.error(e) 

Worker ZMQ 服务器

import time
import zmq
import logging

logging.basicConfig(level=logging.DEBUG)

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:55555")

logging.debug("[SERVER] Starting ZMQ SERVER")

while True:
    logging.debug("[SERVER] Waiting for request")
    message = socket.recv_string()
    time.sleep(1)
    logging.debug("[SERVER] Sending response")
    socket.send_string("Perfect! It is working.")

应用规范

name: basic-app
region: fra
services:
- environment_slug: python
  github:
    branch: main
    deploy_on_push: true
    repo: ...
  http_port: 8080
  instance_count: 1
  instance_size_slug: basic-xs
  name: c-3
  routes:
  - path: /
  run_command: gunicorn --worker-tmp-dir /dev/shm --config gunicorn_config.py app:app
  source_dir: /
  internal_ports:
    - 55555
workers:
- environment_slug: python
  github:
    branch: main
    deploy_on_push: true
    repo: ...
  instance_count: 1
  instance_size_slug: basic-xs
  name: ZMQServer
  run_command: python zmq_server.py
  source_dir: /
- environment_slug: python
  github:
    branch: main
    deploy_on_push: true
    repo: ...
  instance_count: 1
  instance_size_slug: basic-xs
  name: ZMQClient
  run_command: python client.py
  source_dir: /

谢谢您的回答

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?