美文网首页
模块信息交互

模块信息交互

作者: 小丑蛙很挑剔 | 来源:发表于2018-09-15 17:11 被阅读0次

    所在公司的后台业务系统主要分为两块:Java模块负责处理设备的控制,PHP模块主要负责web相关的业务。两套模块的技术都比较老旧,两套系统独立运行,几乎没有直接的信息交互。两者之间的信息交互靠mysql数据库存储,Java模块将设备运行的状态信息,运行记录实时存入mysql数据库,PHP端需要这些设备的信息时,再从mysql查询读取出相关设备的状态或者记录。而PHP端有控制指令发送给Java模块时,则将相关操作指令存入mysql数据库,JAVA每个一段时间轮询mysql数据库是否有操作指令等待处理。

    笔者初学PHP入职公司后,接手维护和开发PHP模块。本就对软件开发运行没有入门,也对公司整套系统运行逻辑不甚了解。没有相关文档,只能就着这些模块的源代码慢慢摸索。仔细阅读代码发现Java模块在支付场景时会直接调用HTTP接口执行PHP模块中的命令,php执行完成后会直接返回结果。而在微信或支付宝的异步通知后,PHP模块又会通过socket模块通过16进制指令的形式告知Java模块支付的相关结果。在后续的维护开发中,有些新特性学要在Java和PHP之间进行信息交互时,笔者基本沿用此套沟通方式:Java向PHP模块主动发起通讯时使用Http端口,PHP向Java模块主动发起通讯时使用socket接口。而随着公司业务拓展,这套方式使用得越多就发现这套方法的弊病很多。http接口是公共接口,不当当本机可以使用,外部网络同样可以访问,将一个内部使用的方法暴露在公网中会有很大的安全隐患,虽然可以限定发起者和使用者都必须是主机地址,但仍难做到完全隔绝的效果,并且通过HTTP的形式在本机内部通讯效率不高。而PHP向Java发送socket的方式,接口调用很不方便,必须维护一个指令列表,指令列表的可读性差,并且占用操作系统的端口资源,在服务器连接的设备众多的情况下更是增加了系统开销。

    两套系统间信息传输的耦合性很强,调试很困难。有新的通讯接口加入时,接口的参数必须重新协商。为解决现有系统的问题,考虑在两个系统中增加一个系统中间件Redis,借助Redis的发布/监听功能实现功能的传输。Java/PHP都不再直接向对方发送信息,而是关闭接口转而监听Redis的某个指定频道,当捕捉到相关频道时,根据捕捉到的信息执行相关的事件操作。在PHP端,如需实时监听redis上的广播信息,则需要使用php单独开一个进程。受限于PHP程序的执行传统,php代码一般放在apache或者ngnix之类的容器中执行,笔者较少接触到单独使用PHP进程的情况。最初的想法是直接写一个PHP脚本,脚本中使用while true的方式使用redis的客户端监听,实验的时候发现如果redis客户端在一段时间内未收到消息会导致PHP超时报错,从而导致脚本崩溃,进而无法做到长时间监听redis频道的任务。在查阅php相关社区后,得知有php模块swoole可以做到笔者的需求。于此将在下一篇文章中详细记录实现过程

    相关文章

      网友评论

          本文标题:模块信息交互

          本文链接:https://www.haomeiwen.com/subject/hkaggftx.html