| 作者 |
内容 |
| jinsong |
关于消息队列这种设计模式的利弊
编写过windows程序的人应该都知道消息队列,尽管design
pattens里没有消息队列这种设计模式,不过我觉得这还是一种模式。现在我在写一个服务器程序,服务器要挂多个模块,我在犹豫模块间的通讯用消息队列是否最好,所以把这个问题拿来,请高手们讨论。
优点:
1、这时一种最简单的把并行访问变成串行访问的办法,减少了许多在并行访问中要考虑的资源共享问题。
2、程序扩充功能相对容易,只需修改消息处理函数即可
3、程序结构清晰、对外接口统一
4、消息的异步响应提高了系统性能
缺点:
1、难以对访问权限进行控制,任何外部程序都可以通过发出消息来执行这个模块的方法
2、把调用方法转换为发送消息,就无法判断参数的有效性,例如服务程序已修改了消息格式,客户端是无法在编译时发现这个错误的。
3、消息机制难以得到返回结果
4、消息机制是不可靠的,不能保证发出的消息一定会被处理。可能在发出消息后,服务程序出现故障或停止了,这是可能会丢弃消息队列中的消息。
|
| 01/08/15 15:55 |
酷帖! 臭帖! 回复 |
| 酷帖评价: 臭帖评价: |
| 返回页首 |
|
| vcc_cn |
回复:
关于消息队列这种设计模式的利弊
服务器的各个模块中用消息队列来通讯是要严格区分,不可都用。例如,如果有多个工作线程来并发执行多个任务,这时用消息对列来分发任务,可以取得很不错的效果;如果这个模块是提供公用的功能,被频繁调用,并且要等着结果才继续,就不应用消息队列了,直接用函数的方式。当然,如果你的模块都是外部程序,那你没有办法,只好用IPC通讯了(不一定用消息队列,其他也可以,如socket,
pipe, 共享内存....)。
如果你要用消息队列,我建议你自己写一个,开销会小很多,也不会和windows的混在一起,你想,如果他界面不响应了,你的服务程序怎么办? |
| 01/08/15 16:26 |
酷帖! 臭帖! 回复 |
| 酷帖评价: 臭帖评价: |
| 返回页首 |
|
| Ohio |
回复:
关于消息队列这种设计模式的利弊
1、如果在消息参数中加上发送者标识或类似的信息,是否可以控制访问权限呢?
2、编译时确实不能知道服务程序修改了消息格式,但我觉得这不重要。
3、消息可以是同步的,类似Windows中的SendMessage,这时可以返回结果。如果用异步消息,就比较复杂了。
4、如果规定消息被处理时要给客户端一个确认,那么客户端得不到确认或结果为失败时,可以判断出消息未被处理,这和调用方法得到失败的返回值差不多。
另外,是否采用消息通讯恐怕要考虑服务程序的性能,如果服务程序能同时处理多个请求(如每个请求对应一个线程),则可以用方法调用,如果必须处理完一个请求才能处理下一个,则只能用消息了。 |
| 01/08/15 16:29 |
酷帖! 臭帖! 回复 |
| 酷帖评价: 臭帖评价: |
| 返回页首 |
|
| jinsong |
谢谢建议
|
| 01/08/15 19:04 |
酷帖! 臭帖! 回复 |
| 酷帖评价: 臭帖评价: |
| 返回页首 |
|
| boss_ch |
java
的 swing 中的设计模式好像更好一些。
|
| 01/08/17 13:22 |
酷帖! 臭帖! 回复 |
| 酷帖评价: 臭帖评价: |
| 返回页首 |
|
| lliiaaoo |
回复:
关于消息队列这种设计模式的利弊
建议参考java 2中的事件响应模型 |
| 01/08/17 14:04 |
酷帖! 臭帖! 回复 |
| 酷帖评价: 臭帖评价: |
| 返回页首 |
|