发明内容
本发明提供一种消息中间件MQ的消息传输方法和装置,以提高消息的可靠性。
一种消息中间件MQ的传输方法,包括:
获取所需要传输的目标消息,并确定与所述目标消息相邻的消息在日志数据库中的标记信息;
在确定所述标记信息为传输失败时,将所述目标消息转存入日志数据库中,并标记所述目标消息传输失败;否则,对所述目标消息进行传输,并判断传输结果;在传输结果为传输失败时,将所述目标消息转存入日志数据库中,并标记所述目标消息传输失败,在传输结果为传输成功时,将所述目标消息存入消息队列,并同步到日志数据库中,并标记所述目标消息传输成功;
根据预先设置的重试机制,对所述日志数据库中标记信息为传输失败的消息进行重新传输。
优选地,对所述日志数据库中标记信息为传输失败的消息进行重新传输之后,进一步包括:
在所述日志表中对重新传输成功的消息所对应的标记信息修改为传输成功。
优选地,所述目标消息的传输包括:发送,和/或,消费;
进一步包括:所述日志数据库利用发送端日志表保存发送的目标消息以及标记信息,和/或,所述日志数据库利用消费端日志表保存消费的目标消息以及标记信息;
确定与所述目标消息相邻的消息在日志数据库中的标记信息,包括:确定与所述发送状态的目标消息相邻的消息在所述发送端日志表中的标记信息,和/或,确定与所述消费状态目标消息相邻的消息在所述消费端日志表中的标记信息;
将所述目标消息转存入日志数据库中,包括:将所述发送状态目标消息转存入所述发送端日志表中,和/或,将所述消费状态目标消息转存入所述消费端日志表中。
优选地,所述重试机制进一步包括:定时器;
在将所述目标消息进行重新传输失败时,继续等待定时器所设定的时间,并在到达定时器所设定的时间时,将所述目标消息进行重新传输;
或,
在将所述目标消息进行重新传输失败时,将日志数据库中其他等待重新传输的消息进行逐个传输。
优选地,进一步包括:在将所述目标消息进行重新传输的次数达到重试机制中所设定的阈值次数时,调用预警接口进行预警提示。
一种消息中间件MQ的传输装置,包括:
确定单元,用于获取所需要传输的目标消息,并确定与所述目标消息相邻的消息在日志数据库中的标记信息;
转存单元,用于在所述确定单元确定所述标记信息为传输失败时,将所述目标消息转存入日志数据库中,并标记所述目标消息传输失败;
传输单元,用于在在所述确定单元确定所述标记信息为传输成功时,对所述目标消息进行传输,触发判断单元;
所述判断单元,用于判断所述传输单元的传输结果,在传输结果为传输失败时,将所述目标消息转存入日志数据库中,并标记所述目标消息传输失败,在传输结果为传输成功时,将所述目标消息存入消息队列,并同步到日志数据库中,并标记所述目标消息传输成功;
重试单元,用于根据预先设置的重试机制,对所述日志数据库中标记信息为传输失败的消息进行重新传输。
优选地,该装置进一步包括:修改单元,
所述修改单元,用于将所述重试单元重试传输成功的消息所对应的标记信息修改为传输成功。
优选地,该装置进一步包括:保存单元,其中,
所述目标消息的传输包括:发送,和/或,消费;
所述保存单元,用于所述日志数据库利用发送端日志表保存发送的目标消息以及标记信息,和/或,所述日志数据库利用消费端日志表保存消费的目标消息以及标记信息;
所述确定单元,进一步用于确定与所述发送状态的目标消息相邻的消息在所述发送端日志表中的标记信息,和/或,确定与所述消费状态目标消息相邻的消息在所述消费端日志表中的标记信息;
所述转存单元,进一步用于将所述发送状态目标消息转存入所述发送端日志表中,和/或,将所述消费状态目标消息转存入所述消费端日志表中。
优选地,所述重试单元,进一步用于:
在将所述目标消息进行重新传输失败时,继续等待定时器所设定的时间,并在到达定时器所设定的时间时,将所述目标消息进行重新传输;
或,
在将所述目标消息进行重新传输失败时,将日志数据库中其他等待重新传输的消息进行逐个传输。
优选地,该装置进一步包括:预警单元,
所述预警单元,用于在将所述目标消息进行重新传输的次数达到重试机制中所设定的阈值次数时,调用预警接口进行预警提示。
本发明实施例提供了一种消息中间件MQ的消息传输方法和装置,其通过获取所需要传输的目标消息,并确定与所述目标消息相邻的消息在日志数据库中的标记信息;在确定所述标记信息为传输失败时,将所述目标消息转存入日志数据库中,并标记所述目标消息传输失败;否则,对所述目标消息进行传输,并判断传输结果;在传输结果为传输失败时,将所述目标消息转存入日志数据库中,并标记所述目标消息传输失败,在传输结果为传输成功时,将所述目标消息存入消息队列,并同步到日志数据库中,并标记所述目标消息传输成功;根据预先设置的重试机制,对所述日志数据库中标记信息为传输失败的消息进行重新传输。在这一过程中,由于传输失败的消息将转存入所述日志数据库,与现有技术相比,其不会丢失所述传输失败的消息,因此,有效提高了提高消息的可靠性。
本发明实施例通过重试机制和具有阀值的预警接口,可以将日志数据库中传输失败的消息自动重试,通过预警接口可以发送预警信息,提醒工作人员处理传输过程中的问题,也进一步提高了消息的可靠性。
本发明实施例通过对发送端发送失败消息进行转存,可以防止发送消息的丢失,对消费端消费失败消息进行转存,不仅可有效防止消费消息丢失,而且可以有效防止消息循环造成的队列堵塞。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,本发明实施例提供了一种消息中间件MQ的消息传输方法,该方法可以包括以下步骤:
步骤101:获取所需要传输的目标消息,并确定与所述目标消息相邻的消息在日志数据库中的标记信息;
步骤102:在确定所述标记信息为传输失败时,将所述目标消息转存入日志数据库中,并标记所述目标消息传输失败;否则,对所述目标消息进行传输,并判断传输结果;在传输结果为传输失败时,将所述目标消息转存入日志数据库中,并标记所述目标消息传输失败,在传输结果为传输成功时,将所述目标消息转存入日志数据库中,并标记所述目标消息传输成功;
步骤103:根据预先设置的重试机制,对所述日志数据库中标记信息为传输失败的消息进行重新传输。
在本发明一个是实施例中,为了更加准确区分重新传输成功与重新传输失败的消息,在步骤103之后,可在所述日志表中对重新传输成功的消息所对应的标记信息修改为传输成功。
在本发明一个实施例中,消息中间件MQ的传输包括接收发送端发送消息记为发送消息,和/或,发送消费端消费消息记为消费消息,为了区别发送消息与消费消息,所述日志数据库是利用发送端日志表保存发送端发送的目标消息以及标记信息,和/或,所述日志数据库是利用消费端日志表保存消费端发送的目标消息以及标记信息。而确定与所述目标消息相邻的消息在日志数据库中的标记信息的具体实现方式是确定与所述发送状态的目标消息相邻的消息在所述发送端日志表中的标记信息,和/或,确定与所述消费状态目标消息相邻的消息在所述消费端日志表中的标记信息。
在本发明一个实施例中,为了使传输失败的消息重新发送具有一定规则,在步骤103中,重试机制通过定时器来实现,其具体的实现方式:在将所述目标消息进行重新传输失败时,继续等待定时器所设定的时间,并在到达定时器所设定的时间时,将所述目标消息进行重新传输,或,在将所述目标消息进行重新传输失败时,将日志数据库中其他等待重新传输的消息进行逐个传输。
在本发明一个实施例中,为了提高数据传输的效率,使用户能够清楚了消息传输情况,在步骤103之后,在将所述目标消息进行重新传输的次数达到重试机制中所设定的阈值次数时,调用预警接口进行预警提示,以使用户能够及时处理异常状况。
由于消息中间件MQ的传输过程包括:接收发送端发送的目标消息记为发送过程,和/或,发送消费端消费的目标消息记为消费过程,为了能够清楚展现消息中间件MQ在传输过程中的具体实现方式,本发明实施例将分别对发送过程和消费过程展开说明。
在现有技术中,当消息已经进入服务器队列,当服务器由于刷盘超时或同步到Slave超时等原因导致服务器宕机,将导致消息丢失。
在本发明实施例中,建立了日志数据库,用以存放发送端日志数据表和消费端日志数据表,用以备份发送端发送的数据和消费端消费的数据同时对备份消息是否发送成功进行标记,这一过程可保证消息不会丢失。
如图2所示,本发明实施例提供了消息中间件MQ接收发送端发送的消息的方法,该方法可以包括以下步骤:
步骤201:接收发送端发送的目标消息,并确定与目标消息相邻的消息在发送端日志表中的标记信息是否为发送失败,如果标记信息为发送失败,则触发步骤202,否则,触发步骤203;
在发送端在通过中间件MQ发送目标消息过程中,首先,根据目标消息的标识如key值、MD5值等,遍历发送端日志数据表,查看是否存在与目标消息标识一致的未发送成功的消息,下面将以订单采集应用为发送端,以配送应用和物流应用为消费端,主要业务是主要业务是订单采集应用发送具有关联和顺序的订单消息1和订单消息2,以供配送应用和物流应用消费,展开说明本发明实施例的具体实现过程。本发明实施例将以订单号作为发送端和消费端的key值,当发送端通过中间件MQ发送目标消息时,将首先根据目标消息的订单号遍历发送端日志表,检索是否存在未发送成功的与该目标消息相邻的消息,如:订单消息2是对订单消息1的更新,其只携带了订单号及更新数据,而并未携带订单的属性信息,那么,如果订单消息1未发送成功,将导致订单消息2不可用,通过该步骤,以确保消息的顺序性和完整性。尤其对于同步业务来说,保证数据的顺序性和完整性显得尤为重要。
本发明实施例中,只有当消息被消息队列接收并落盘才会在日志数据表中被标记为发送成功,除此以外的返回状态及抛出的异常均可视为发送不成功,如:中间件的服务器刷盘超时,消息已经进入MQ消息队列,此时服务器宕机,消息丢失;中间件的服务器同步到Slave超时,消息已经进入MQ消息队列,此时服务器宕机,消息丢失;服务器抛出的异常等等均被视为消息发送失败,将对丢失的消息在发送端日志表中标记为发送失败消息。
为了使各个步骤更加清晰,在本实施例中,各个步骤均以订单采集应用为发送端发送订单消息1和订单消息2,以配送应用和物流应用为消费端消费订单消息1和订单消息2为例展开说明。
步骤202:将目标消息转存入发送端日志表中,并标记目标消息发送失败;
例如:当订单消息2发送过程中,通过订单号检索到订单消息1仍没有发送成功,那么,该订单消息2将直接转存入发送端日志表,并被标记为发送失败的消息,以保证该具有顺序性的消息可以顺序发送。
在这一过程中,中间件将为发送端返回SEND_SUCCESS代表消息发送成功,发送端可继续发送消息,SEND_FAIL代表转存失败,发送端需进行相应处理,以保证业务不受影响。
步骤203:对目标消息进行发送,并判断发送结果是否为失败,如果发送结果为失败则触发步骤204,否则触发步骤205;
例如:当订单消息1已进入到消息队列并落盘,那么订单消息2将直接发送给消息队列,同时跟踪并判断发送结果。
步骤204:将目标消息转存入发送端日志表中,并标记目标消息发送失败;
例如:如果步骤203中,发送订单消息2失败,则将该订单消息2转存入发送端日志表中,并标记目标消息发送失败。
步骤205:将目标消息存入消息队列,等待消费端消费,并同步到发送端日志表中,并标记所述目标消息发送成功;
例如:步骤203中订单消息2成功进入消息队列,则将该订单消息2同步到发送端日志表中,并标记所述目标消息发送成功;如在这一过程中,发生MQ消息队列中的订单消息2丢失,而未被消费端消费,则发送端日志表中的订单消息2的标记信息将变为发送失败。
步骤206:根据预先设置的重试机制,对发送端日志表中标记信息为发送失败的消息进行重新发送,判断重新发送是否成功,如果是则触发步骤207,否则触发步骤208;
在发送端日志表中存在的发送失败的消息,将根据顺序性等原则,依据重试机制,发送标记为失败的消息。如:订单消息1和订单消息2均在发送端日志表中标记信息均为发送失败,则,根据重试机制,中间件将首先重试将订单消息1发至消息队列。
本发明实施例的重试机制:在将所述目标消息进行重新发送失败时,继续等待定时器所设定的时间,并在到达定时器所设定的时间时,将所述目标消息进行重新发送;或,在将所述目标消息进行重新发送失败时,将日志数据库中其他等待重新发送的消息进行逐个发送。
步骤207:在发送端日志表中对重新发送成功的消息所对应的标记信息修改为发送成功;
例如:步骤206中的订单消息1经过重试成功进入消息队列等待消费端消费,那么,在发送端日志表中,订单消息1的标记信息为发送成功。
步骤208:在将目标消息进行重新发送的次数达到重试机制中所设定的阈值次数时,调用预警接口进行预警提示。
在本发明实施例中,考虑到可能出现长时间的外部故障,造成频繁的重试对系统性能的影响,本发明实施例通过对重试次数进行控制,例如暂定重试5次,超出次数则视为系统严重故障,可通过调用定时器接口,暂停定时器,以停止重试操作。同时进行异常预警。
为了保证消费端出现消费错误时,不会对发送端造成影响,尤其对于同步业务来说。本发明实施例在日志数据库中也为消费端建立了消费日志表,这在前面已有说明,下面将本发明实施例在消费端的传输展开说明。
如图3所示,本发明实施例提供了消息中间件MQ发送消费端消费的消息的方法,该方法可以包括以下步骤:
步骤301:通过消息队列发送消费端消费的目标消息,并确定与目标消息相邻的消息在消费端日志表中的标记信息是否为消费失败,如果标记信息为消费失败,则触发步骤302,否则,触发步骤303;
在消息中间件MQ通过消息队列发送目标消息以供消费端消费过程中,首先,中间件MQ根据目标消息的标识如key值、MD5值等,遍历消费端日志数据表,查看是否存在与目标消息标识一致的未被消费成功的消息,下面将以订单采集应用为发送端,以配送应用和物流应用为消费端,主要业务是订单采集应用发送具有关联和顺序的订单消息1和订单消息2,以供配送应用和物流应用消费,展开说明本发明实施例的具体实现过程。本发明实施例将以订单号作为发送端和消费端的key值,当中间件MQ将消息队列中的目标消息发送给消费端配送应用和物流应用时,将首先根据目标消息的订单号遍历消费端日志表,检索是否存在未被消费成功的与该目标消息相邻的消息,如:订单消息2是对订单消息1的更新,其只携带了订单号及更新数据,而并未携带订单的属性信息,那么,如果订单消息1未被消费成功,将导致订单消息2不可用,通过该步骤,以确保消息的顺序性和完整性。尤其对于同步业务来说,保证数据的顺序性和完整性显得尤为重要。
为了使各个步骤更加清晰,在本实施例中,各个步骤均以订单采集应用为发送端发送订单消息1和订单消息2,以配送应用和物流应用为消费端消费订单消息1和订单消息2为例展开说明。
步骤302:将目标消息转存入消费端日志表中,并标记目标消息消费失败;
例如:当订单消息2在消息队列中,中间件将其发送给消费端消费时,通过订单号检索到订单消息1仍没有被消费成功,那么,该订单消息2将直接转存入消费端日志表,并被标记为消费失败的消息,同时,为中间件返回消费成功的标记,以使中间件可进行后续操作,同时保证该具有顺序性的消息可以顺序发送。
步骤303:触发消费端对目标消息进行消费,并判断消费结果,如果消费结果为失败则触发步骤304,否则触发步骤305;
例如:当订单消息1已被消费端消费,那么订单消息2将直接发送给消费端进行消费,同时跟踪并判断消费端的消费结果。
步骤304:将目标消息转存入消费端日志列表中,并标记目标消息消费失败;
例如:如果步骤303中,消费端消费订单消息2失败,则将该订单消息2转存入消费端日志表中,并标记该消息为消费失败。
步骤305:消息队列触发消费端消费目标消息之后的下一条消息,并将目标消息同步到消费端日志表中,并标记目标消息消费成功;
例如:步骤303中订单消息2成功被消费端消费,则将该订单消息2同步到消费端日志表中,并标记该消息消费成功。
步骤306:根据预先设置的重试机制,对消费端日志表中标记信息为消费失败的消息进行重新消费,判断重新消费是否成功,如果是则触发步骤307,否则触发步骤308;
在消费端日志表中存在的消费失败的消息,将根据顺序性等原则,依据重试机制,中间件将发送标记为失败的消息给消费端消费。如:订单消息1和订单消息2均在消费端日志表中标记信息均为消费失败,则,根据重试机制,中间件将首先重试将订单消息1发至消息队列以发送给消费端消费。
本发明实施例的重试机制:在将所述目标消息进行重新发送失败时,继续等待定时器所设定的时间,并在到达定时器所设定的时间时,将所述目标消息进行重新发送;或,在将所述目标消息进行重新发送失败时,将日志数据库中其他等待重新发送的消息进行逐个发送。
步骤307:在消费端日志表中对重新消费成功的消息所对应的标记信息修改为消费成功;
例如:步骤306中的订单消息1经过重试成功被消费端消费,那么,在消费端日志表中,订单消息1的标记信息为消费成功。
步骤308:在将目标消息进行重新消费的次数达到重试机制中所设定的阈值次数时,调用预警接口进行预警提示。
在本发明实施例中,考虑到可能出现长时间的外部故障,造成频繁的重试对系统性能的影响,本发明实施例通过对重试次数进行控制,例如暂定重试5次,超出次数则视为系统严重故障,可通过调用定时器接口,暂停定时器,以停止重试操作。同时进行异常预警。
在本发明实施例中,对于消费端消费的整个过程来说,当消息被消费成功或者成功转存入消费日志表,均为中间件返回SEND_SUCCESS标志,表明消息被成功消费或转存,这样可以使消息队列进行下一消息的处理,避免消息消费不成功带来消息队列的堵塞;当消息中间件返回SEND_FAIL代表转存失败,提醒工作人员进行相应处理,以保证业务不受影响。
在本发明实施例中,预警提示主要是:消息达到重试机制设定的重试次数限制后,仍未被发送或消费成功,则通过预警提示运维人员需及时检查系统,排除故障;转存发送或消费消息失败,则通过预警提示运维人员需及时检查系统,排除故障。
本发明实施例至少具有如下的有益效果:
1.本发明实施例提供了一种消息中间件MQ的消息传输方法和装置,其通过获取所需要传输的目标消息,并确定与所述目标消息相邻的消息在日志数据库中的标记信息;在确定所述标记信息为传输失败时,将所述目标消息转存入日志数据库中,并标记所述目标消息传输失败;否则,对所述目标消息进行传输,并判断传输结果;在传输结果为传输失败时,将所述目标消息转存入日志数据库中,并标记所述目标消息传输失败,在传输结果为传输成功时,将所述目标消息存入消息队列,并同步到日志数据库中,并标记所述目标消息传输成功;根据预先设置的重试机制,对所述日志数据库中标记信息为传输失败的消息进行重新传输。在这一过程中,由于传输失败的消息将转存入所述日志数据库,与现有技术相比,其不会丢失所述传输失败的消息,因此,有效提高了提高消息的可靠性。
2.本发明实施例通过重试机制和具有阀值的预警接口,可以将日志数据库中传输失败的消息自动重试,通过预警接口可以发送预警信息,提醒工作人员处理传输过程中的问题,也进一步提高了消息的可靠性。
3.本发明实施例通过对发送端发送失败消息进行转存,可以防止发送消息的丢失,对消费端消费失败消息进行转存,不仅可有效防止消费消息丢失,而且可以有效防止消息循环造成的队列堵塞。
如图4、图5所示,本发明实施例提供了一种消息中间件MQ的传输装置。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。从硬件层面而言,如图4所示,为本发明实施例的装置所在设备的一种硬件结构图,除了图4所示的CPU、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的设备通常还可以包括其他硬件,如负责处理转存的芯片等等。以软件实现为例,如图5所示,作为一个逻辑意义上的装置,是通过其所在设备的CPU将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。本实施例提供的消息中间件的传输装置50包括:
确定单元501,用于获取所需要传输的目标消息,并确定与所述目标消息相邻的消息在日志数据库中的标记信息;
转存单元502,用于在所述确定单元确定所述标记信息为传输失败时,将所述目标消息转存入日志数据库中,并标记所述目标消息传输失败;
传输单元503,用于在在所述确定单元确定所述标记信息为传输成功时,对所述目标消息进行传输,触发判断单元;
判断单元504,用于判断所述传输单元的传输结果,在传输结果为传输失败时,将所述目标消息转存入日志数据库中,并标记所述目标消息传输失败,在传输结果为传输成功时,将所述目标消息存入消息队列,并同步到日志数据库中,并标记所述目标消息传输成功;
重试单元505,用于根据预先设置的重试机制,对所述日志数据库中标记信息为传输失败的消息进行重新传输。
在本发明另一实施例中,如图6所示,消息中间件MQ的传输装置可以进一步包括:
修改单元601:用于将所述重试单元重试传输成功的消息所对应的标记信息修改为传输成功。
在本发明一个实施例中,如图7所示,消息中间件MQ的传输装置可以进一步包括:保存单元701
所述目标消息的传输包括:发送,和/或,消费;
保存单元701,用于所述日志数据库利用发送端日志表保存发送的目标消息以及标记信息,和/或,所述日志数据库利用消费端日志表保存消费的目标消息以及标记信息,以触发确定单元;
所述确定单元,进一步用于确定与所述发送状态的目标消息相邻的消息在所述发送端日志表中的标记信息,和/或,确定与所述消费状态目标消息相邻的消息在所述消费端日志表中的标记信息;
所述转存单元,进一步用于将所述发送状态目标消息转存入所述发送端日志表中,和/或,将所述消费状态目标消息转存入所述消费端日志表中。
在本发明一个实施例中,所述重试单元,进一步用于:在将所述目标消息进行重新传输失败时,继续等待定时器所设定的时间,并在到达定时器所设定的时间时,将所述目标消息进行重新传输;或,在将所述目标消息进行重新传输失败时,将日志数据库中其他等待重新传输的消息进行逐个传输。
在本发明一个实施例中,如图8所示,消息中间件MQ的传输装置可以进一步包括:
预警单元801,用于在将所述目标消息进行重新传输的次数达到重试机制中所设定的阈值次数时,调用预警接口进行预警提示。
需要说明的是,在本文中,诸如第一和第二之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个······”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同因素。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。