如何用计算机和客户端与服务端,消息队列机制在服务端与客户端的应用

我们在上文中给大家简单分析了消息队列机制的实现方法等内容,而今天我们就再来说说,消息队列机制在服务端与客户端的具体应用方法。

9df73ec4062b7ce0a49e71616174a623.png

服务端

服务端的实现比较简单,和一般的Consumer的区别只在于需要将请求回复到replyTo指定的queue中并带上消息标识correlation_id即可

服务端的一点小优化:

超时的处理是由客户端来实现的,那服务端有没有可以优化的地方呢?

答案是有的:如果我们的服务端处理比较耗时,如何判断客户端是否还在等待响应呢?

我们可以使用passive参数去检查replyTo的queue是否存在,因为客户端声明的是内部队列,客户端如果断掉链接了这个queue就不存在了,这时服务端就无需处理这个消息了。

客户端

客户端承担了更多的工作量,包括:

声明replyTo队列(使用amq.rabbitmq.reply-to会简单很多)

维护请求和响应消息(使用的correlation_id来关联)

消费服务端的返回

处理超时等异常情况(使用BlockingQueue来阻塞获取)

好在spring已经实现了一套完备可靠的代码,我们在清楚了流程和关键点之后,可以直接使用spring提供的RabbitTemplate,无需自己实现。

使用MQ实现RPC的意义

通过MQ实现RPC看起来比客户端和服务器直接通讯要复杂一些,那我们为什么要这样做呢?或者说这样做有什么好处:

将客户端和服务器解耦:客户端只是发布一个请求到MQ并消费这个请求的响应。并不关心具体由谁来处理这个请求,MQ另一端的请求的消费者可以随意替换成任何可以处理请求的服务器,并不影响到客户端。

减轻服务器的压力:传统的RPC模式中如果客户端和请求过多,服务器的压力会过大。由MQ作为中间件的话,过多的请求而是被MQ消化掉,服务器可以控制消费请求的频次,并不会影响到服务器。

服务器的横向扩展更加容易:如果服务器的处理能力不能满足请求的频次,只需要增加服务器来消费MQ的消息即可,MQ会帮我们实现消息消费的负载均衡。

可以看出RabbitMQ对于RPC模式的支持也是比较友好地,

amq.rabbitmq.reply-to,reply_to,correlation_id这些特性都说明了这一点,再加上spring-rabbit的实现,可以让我们很简单的使用消息队列模式的RPC调用。

【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现客户端服务端的通信可以使用套接字(socket)来实现,具体步骤如下: 1. 创建套接字 客户端服务端都需要创建一个套接字。在C语言中,我们可以使用`socket()`函数来创建套接字,函数原型如下: ```c int socket(int domain, int type, int protocol); ``` 其中,`domain`表示协议族,比如`AF_INET`表示IPv4协议族,`type`表示套接字类型,比如`SOCK_STREAM`表示面向连接的套接字,`protocol`表示具体的协议,比如`IPPROTO_TCP`表示TCP协议。如果不确定应该传什么参数,可以参考具体的应用场景。 2. 绑定地址 服务端需要将自己的地址与套接字绑定,这样客户端才能连接到服务端。在C语言中,我们可以使用`bind()`函数来绑定地址,函数原型如下: ```c int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); ``` 其中,`sockfd`表示套接字描述符,`addr`表示要绑定的地址,`addrlen`表示地址的长度。 3. 监听连接 服务端需要监听客户端的连接请求,这样客户端才能连接到服务端。在C语言中,我们可以使用`listen()`函数来监听连接,函数原型如下: ```c int listen(int sockfd, int backlog); ``` 其中,`sockfd`表示套接字描述符,`backlog`表示连接队列的长度,如果连接请求超过了队列长度,将会被拒绝。 4. 接受连接 客户端连接到服务端后,服务端需要接受连接,这样客户端服务端才能开始进行通信。在C语言中,我们可以使用`accept()`函数来接受连接,函数原型如下: ```c int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); ``` 其中,`sockfd`表示套接字描述符,`addr`表示客户端的地址,`addrlen`表示地址的长度。 5. 发送和接收数据 客户端服务端连接成功后,就可以进行数据的发送和接收了。在C语言中,我们可以使用`send()`函数来发送数据,函数原型如下: ```c ssize_t send(int sockfd, const void *buf, size_t len, int flags); ``` 其中,`sockfd`表示套接字描述符,`buf`表示要发送的数据,`len`表示数据的长度,`flags`表示发送的标志。 同样的,我们可以使用`recv()`函数来接收数据,函数原型如下: ```c ssize_t recv(int sockfd, void *buf, size_t len, int flags); ``` 其中,`sockfd`表示套接字描述符,`buf`表示接收数据的缓冲区,`len`表示缓冲区的长度,`flags`表示接收的标志。 以上就是用C语言实现客户端服务端的通信的基本步骤。具体实现可以参考相关的网络编程教程和示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值