通讯中间件的性能和准确率是很重要的。
以前的设计都是针对 应用程序 和插件来定义消息队列。而没有考虑消息的目的地。这样造成的后果是
读出消息发送时,可能才知道,目的主机网络不通,从而导致发送到这个主机的数据不断被读出而没有发送出去,会丢掉。
即使我们做一个缓存机制,因为读取消息接口并不知道目的主机(消息队列是基于应用而不只基于主机的),因此,不能发送的消息
还是会源源不断的读出来,这样即便缓存,也会慢慢耗尽。从而丢失消息,而且也不能很快反映到应用程序。
我在想,应该修改消息队列的定义,让消息队列的定义是基于目的主机的,这样,通讯程序一旦发现目的主机不可达,就在该主机的
发送队列缓存一个消息体,然后就不会读取发往该主机的消息了。即便应用程序还不停的在写消息,当消息队列慢时,它将会知道,从而停止写
或者等待,这样的机制,即保证了消息不会丢失,也保证了目的主机不可达时能够及时的反映给应用程序。
但是缺点是:第一,消息队列的定义不好定义,还得思考。第二:写消息的接口,可能比较难实现,因为会牵扯到多个应用在发消息给同一个
主机的时候,写同一个消息队列,要做锁机制。至于发送程序,遍历主机的消息队列时,发送失败,就缓存,设置不可达标志位,不再发送消息直到
该主机可达,先发送缓存的消息,然后发送队列中的消息。
也可采用原来的消息队列机制,只不过要增加一个分类器,目的是将每个应用的输出消息读出来,然后根据其目的地进行分发到各个目的主机的消息队列。这样省去了写操作的互斥过程,但是要增加额外的分类器程序,并且多拷贝两次消息。
阅读(1942) | 评论(0) | 转发(0) |