消息的同步发送,异步发送以及消息发送的可靠性

转载 2018年04月17日 11:37:50

最近写的一个通信框架中有两种最基本的消息发送方式:同步发送和异步发送。

同步方式:
消息的发送方发A送一条消息到接收端B,B收到消息之后需要对消息进行处理,然后发送ACK确认消息回A,A收到B的ACK之后就可以认为这条消息发送成功,并且保证B顺利收到并处理,在A收到ACK之前A将一直处于阻塞等待状态。

异步方式:
可细分成发送线程和接受线程异步,发送端进程和接收端进程异步;

发送线程和接收线程的异步指消息发送线程A发消息到B,A和B都有消息的接收和发送缓存,A将消息送入发缓存之后立即返回接着发下一条消息,缓存中的消息将被逐条写入TCP,B端从TCP拿到消息先入收缓存,B从收缓存中逐条取出处理,这里的收发两个线程处于不同的进程中,且同一时间可能同时处理不同的消息。

发送端进程和接收端端进程异步指的是,发送方和接收方不必同时在线,A将消息发送到消息队列,B上线之后从消息队列中获取A发送过来的消息。

同步和异步发送消息对于消息发送可靠性的保障上有区别。这里的消息发送可靠性指消息在网络连接异常断开,进程异常重启之后所有的消息都不丢失。


同步发送保证了每条消息都被顺利收到并得到处理,若发送消息之后等待ACK超时表示对方可能未妥善收到并处理消息,发送方可以对消息进行重发等操作。因此同步发送的方式一定程度上保证了消息的可靠性。

异步方式由于中间存在收发缓存,当接收端进程异常重启,缓存内消息可能丢失,因此发送方发出去的消息并不能保证被接收并得到处理。像线程级的异步来说,必须在收发双方的消息中增加消息序列号,并对发送的每条消息,消息发送的序列号,消息接收的序列号进行持久化,这样进程重启之后可以对双方的序列号进行同步,从持久化模块中取出丢失的部分消息。以这样的方式才能保证消息发送的可靠性。

进程级的异步收发两端消息均通过中间的消息队列进行,消息队列最常见的就是消息中间件,JMS,MQ等等,发送端通过同步方式将消息发往消息队列,消息队列必须对消息进行持久化,然后以异步或同步方式发往消息接收方,这里的关键就是发送方和MQ之间通过同步方式和MQ上的消息持久化来保A,B两端的消息发送可靠性。

在保证消息发送可靠性的前提下同步方式发送消息的处理性能可能反而超越异步方式的发送,原因是异步发送每条消息需要进行多次地持久化数据。

同步方式的消息发送和异步方式的消息发送

通信有两类不同的基本方式: 具有依时性的同步方式以及与时间无关的异步方式。消息传送中间件有许多不同类型, 它们分别都能够支持一类基本方式的消息通信, 有时可以支持两类方式。 根据定义, 同步执行...
  • nash603
  • nash603
  • 2011-09-01 16:58:32
  • 7804

RocketMQ入门(3.发送同步消息之可靠同步发送)

原理:同步发送是指消息发送方发出数据后,会在收到接收方发回响应之后才发下一个数据包的通讯方式。 应用场景:此种方式应用场景非常广泛,例如重要通知邮件、报名短信通知、营销短信系统等。 ...
  • onlyyjco
  • onlyyjco
  • 2016-08-03 17:44:42
  • 2470

kafka producer 发送消息

package com.zhp.springbootstreamdemo.kafka; import org.apache.kafka.clients.producer.Callback; impo...
  • supper10090
  • supper10090
  • 2017-11-21 16:01:04
  • 1393

RocketMQ 发送消息疑问

我们都知道 rocketmq 发送消息有 3 中方式: 1、同步      同步发送消息,是可以拿到消息结果的,     2、oneway 方式      这种方式最适合发送日志啦,比如,最...
  • SUHUAGUO1111
  • SUHUAGUO1111
  • 2016-08-22 22:27:09
  • 646

amq的queue同步和异步接收消息

一、jms同步?  在演示示例之前先解释一个问题。在学习activemq的时候有个问题很困扰我,众所周知jms是异步通信,但为什么大量网页和例子里都说明activemq有同步接收消息和异步接收消息。...
  • asdfsadfasdfsa
  • asdfsadfasdfsa
  • 2016-12-12 15:51:03
  • 5898

kafka 札记-----kafka producer 端 发送数据分为 同步(实时)和异步(达到设定发送条件)

kafka producer 端 发送数据分为 同步(实时)和异步(达到设定发送条件) 异步发送相关参数 producer.type  async/sync 默认是sync  ...
  • tzwjava
  • tzwjava
  • 2014-10-09 14:31:32
  • 7548

第106讲:解析Akka中的消息的不同发送方式方式详解学习笔记

第106讲:解析Akka中的消息的不同发送方式方式详解学习笔记   akka中有两种消息发送方式: 1.发送后立即忘记(Fire and Forget) 2.发送消息后等待目标actor回复(...
  • slq1023
  • slq1023
  • 2015-09-24 21:37:20
  • 642

简单消息,异步消息,同步消息辨析

简单消息,异步消息,同步消息辨析 附例子
  • a31081314
  • a31081314
  • 2016-12-02 10:35:26
  • 901

kafka消息与同步机制

如上图所示:Producer根据指定的partition方法(默认round-robin、hash等),将消息发布到指定topic的partition里面;kafka集群接收到Producer发过来的...
  • sgs1018
  • sgs1018
  • 2017-03-09 19:31:53
  • 5043

RabbitMQ学习(十)之spring整合发送同步消息(注解实现)

上一篇文章通过xml配置rabbitmq的rabbitTemplate,本节将使用注解的形式实现同步消息的发送。 1.注解配置AnnotationConfiguration.Java [j...
  • qq397709884
  • qq397709884
  • 2016-07-15 15:45:30
  • 2315
收藏助手
不良信息举报
您举报文章:消息的同步发送,异步发送以及消息发送的可靠性
举报原因:
原因补充:

(最多只允许输入30个字)