云计算设计模式(十六)——优先级队列模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了云计算设计模式(十六)——优先级队列模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6082字,纯文字阅读大概需要9分钟。
内容图文
云计算设计模式(十六)——优先级队列 模式
优先
发送到
服务,以便
具有较高优先级
的请求
被接收和
高于
一个
较低优先级
的
更
快速地处理
请求。
这种模式是
在
应用程序是有用的
,它提供
不同的服务
级别
保证或者针对独立
客户
。
背景和 问题
应用程序可以
委托给其他
服务的具体
任务;
例如,为了
执行后台处理
或
与其他应用程序
或服务的
整合
。
在云中
,消息
队列
通常用于将
任务委派给
后台处理。
在
许多情况下,
请求由
服务
接收的顺序
是不重要的。
然而
,
在某些情况下
,可能需要
优先考虑
的具体要求
。
这些要求必须
早于
较低优先级
的
其他可能
先前已
发送
由应用程序
进行处理。
解决方案
队列
通常是
先入
先出
(
FIFO
)
结构
,而消费者
通常会收到
他们
发布到
队列
中的
顺序相同
的消息
。
然而,一些
消息队列
支持
优先级
的消息传递
;
应用程序
发布一条消息
可以
分配优先级
的消息
,并
在队列中的
消息会自动
重新排序
,使得
具有较高优先级
的消息将
这些
优先级较低
的
前
被接收。
图1
示出了
一个
队列
,它提供
优先权
的消息
。
图1 -
使用支持
消息
优先级
排队机制
注意:
大多数
消息队列
的实现
支持多个
消费者
(
以下
的
竞争
消费者
模式
)和消费
过程的数量
可以按比例增加
或减小
的需求
支配。
在
不支持
基于优先级的
消息队列
系统中,
一种替代
的解决方案是
为每一个
优先级
的独立
队列。
该
应用程序负责
将邮件投递
到
适当的队列
。
每个队列
可以有
一个单独
的消费者
池
。
高
优先级队列
可以有
更快的硬件
比
低优先级
队列中运行
的消费者
一个更大的
泳池
。
图2示出
了这种方法。
图2
-
使用不同的
消息队列
为每个
优先级
这种策略
的变化是
有
消费者认为
检查
对
高优先级
队列中的消息
,然后再
才开始
从
低优先级
队列中
读取
消息
,如果
没有更高
优先级的消息
都在等待
的
一个池
。
还有
,使用
消费
过程的
一个池
的溶液
之间的一些
语义
差异(或者
使用支持
不同的优先级
或
多个队列
,每个
处理
一个
单一
的优先级
消息
的消息
的单个
队列
)
,
以及使用
多个队列
用
溶液
为每个队列
一个单独的
游泳池。
在单
池
的做法
,
高
优先级的消息
总是会
收到
以前低
优先级的消息
处理。
在
理论
中,具有
非常低的
优先级的消息
可以被
不断地
取代
,并且可能
永远不会
被处理。
在多
池
的方法
,
较低优先级的
报文
将总是
被处理
,
只是
不
一样迅速
的那些
更高的优先级
的
(取决于
池和
它们具有
可用资源
的相对大小
)
。
使用
优先级排队
机制
可提供
以下优点:
?
它允许应用程序
以
满足
必要
的
可用性或性能
优先
的业务需求
,
如
提供不同
级别的服务
,以
客户的
特定群体
。
?
它可以帮助
最大限度地降低运营
成本。
在单
队列
的方式
,
你可以
缩减
用户
的数量
,如果
有必要的。
高优先级消息
仍将被
首先处理
(虽然
可能
更慢
)
,
和
低优先级的
消息
可能会延迟
更长。
如果
您已实现
与消费者
的
每一个
单独的
队列
池
多个消息
队列
的方式
,可以减少
消费者的
池
低优先级
队列
,
或者
甚至
停止
所有
监听
的讯息的
消费者
暂停
处理
一些非常
低优先级
队列
这些队列
。
?在
多个消息
队列
的方法
可以帮助
划分
的基础上
处理要求
的消息
,以
最大限度地提高
应用程序的性能
和可扩展性
。
例如,
重要的
任务
,可以
优先
被
立即
运行,而
不太重要的
后台任务
可以
被
安排在
不太繁忙的
时段
运行
的接收器
来处理
接收
处理。
问题和注意事项
在决定
如何实现
这个模式
时,请考虑
以下几点
:
?定义
优先级
的
解决方案的
情况下
。
例如,“
高优先级”
可能意味着,
信息应该
在十秒内
进行处理。
标识
要求
处理
高优先级
的项目
,
以及
其他什么
资源
必须分配给
符合这些标准
。
?
确定是否
所有高优先级
的项目
必须在任何
优先级较低的
项目之前
进行处理
。
如果该
消息是由
消费者的
一个池
被处理
,
可能有必要
提供一种可
抢先
和
暂停
正在处理
的低
优先级
消息,如果
更高优先级的
消息,有
一个
任务
的机制。
?在
多个
队列中
的方法,使用
该
监听所有
的队列
,而不是
一个
专门的客户
池
的每个
队列
的消费
过程的
一个池
时
,消费者
必须应用
一种算法
,以确保
它
总是
从
那些
从
低
之前
较高优先级
的队列
提供服务
的消息
优先级队列
。
?监视
处理
的
高
和
低
优先级队列中
的
速度
,以确保
在
这些
队列中的消息
的
预期的速率
进行处理。
?如果需要
,以保证
低
优先级的消息
将被处理
时,
可能有必要
实现
与消费者
的多个池
的
多个消息
队列
的方法。
或者,在
一个
支持
消息优先
队列
,
它可能会
动态地
增加
一个
排队的
消息的优先级
,因为它
的年龄
。
然而,该方法
依赖于
消息队列
提供
此功能。
?
使用单独的
队列中
每个
消息优先级
最适合
有
少数
明确定义的
优先级
系统。
?
消息优先级
可以通过
系统
逻辑
决定的。
例如
,
而不是
明确的
高和低
优先级的消息
,
他们可以
被指定为
“
自费
客户”
,
或“非
自费
的客户
。
”
根据您的
商业模式,
你的系统
可能会
分配更多的
资源,
从
收费
处理消息
付费用户
比非
自费
的。
?
有
可能是
检查
队列
的
消息相关联的
金融和
处理成本
(
一些商业
邮件系统的
消息被
发布
或检索
每次
收取
一小笔费用
,每次
一个队列
中查询
消息)
。
检查
多个队列
时,该
成本
将有所增加。
?它
可以是
能够
动态调整
的基础上
,该
池
所服务
的队列的
长度
消费者
的
一个
池的大小
。
欲了解更多
信息,请参阅
自动缩放
指导
。
何时 使用 这个模式
这种模式
非常适合
场景
:
?
系统必须
处理可能
有不同的侧重点
多个任务
。
?不同的
用户或
租户应
配以
不同的优先级
。
例子
微软Azure
不提供
经过
整理
的
本地支持
邮件
自动
优先级
排队机制
。
然而,它
确实提供了
Azure的
服务总线
主题
和订阅
,支持
排队
机制,
提供邮件
过滤
,具有
多种灵活
的功能,
使其非常适合
用在
几乎所有的
优先级队列
的实现
在一起。
一个
Azure的
解决方案,
可以实现
服务总线
话题,
其中
一个应用程序
可以发布消息
,
以同样的方式
作为一个
队列。
消息
可以包含
在
应用程序定义的
自定义属性
的形式
的元数据。
服务总线
订阅可以
与
主题
相关联,并且
这些订阅
可以筛选
根据
它们的属性
信息。
当一个应用程序
将消息发送到
一个
主题
,该消息
被定向到
从那里
它
可以
被消费者
阅读相应的
订阅。
消费者
的过程
可以检索
使用
相同的语义
消息队列
(
订阅
是一个逻辑
队列
)
从
一个
订阅
消息。
图3
示出了使用
的Azure
服务总线
主题
和订阅
的解决方案。
图3
-
实现
与
Azure的
服务总线
主题
和订阅
优先级队列
在图3中
的
应用程序创建
多个
消息和
每个消息
与
价值
分配
被称为
优先级
的自定义属性
,
无论是
高还是低。
该应用程序
的帖子
,这些
消息
的一个话题。
这个主题
有两个相关的
订阅,
这
两个滤波器
的消息
通过检查
优先级属性
。
一位
接受
认购
,其中
优先级
属性设置为
高
的消息
,
而
其他
接受
其中
优先级
属性设置为
低
的消息
。
消费者
池
读取
每个订阅
的消息
。
高
优先认购
有较大的
游泳池,
而这些
消费者
可能会
更
强大
(
且昂贵)的
计算机上运行
有
提供
比
消费者在
低优先级
池的更多
资源
。
请注意,
没有什么
特别的
高,低
优先级消息
在
这个例子中
指定
。
这些
仅仅是
指定为
每个消息中
的属性
的标签,
并
用于引导
消息发送到
一个
特定
的订阅。
如果
附加的
优先级
是必需的,
它
是比较
容易地创建
进一步
的订阅和
消费者
进程池
来处理这些
优先级。
在
可用于此
引导
代码
时Queue
解决方案包含
这种方法
的一个实现。
该解决方案
包含一个名为
PriorityQueue.High
和
PriorityQueue.Low
两个工作
角色
的项目。
这两个
辅助角色
继承
的类
被称为
PriorityWorkerRole
它包含
用于连接到
一个
指定的预订
中
OnStart方法
的功能。
该
PriorityQueue.High
和
PriorityQueue.Low
辅助角色
连接到
不同的预订
,
他们的
配置设置
来定义。
管理员可以配置
每个角色的
不同数量
要运行
;
通常
会有
比
PriorityQueue.Low
工作者角色
的
PriorityQueue.High
辅助角色
更多的实例
。
在
PriorityWorkerRole
类
的
Run方法
安排
虚拟
ProcessMessage的
方法(在
PriorityWorkerRole
类
定义)
的
队列中
接收到的每个
消息被
执行。
下面的代码显示
了
运行
和
ProcessMessage的
方法
。
在
类
的QueueManager
,
在
PriorityQueue.Shared
项目
定义
,
提供了
辅助方法
使用
的Azure
服务总线
队列。
public class PriorityWorkerRole : RoleEntryPoint { private QueueManager queueManager; ... public override void Run() { // Start listening for messages on the subscription. var subscriptionName = CloudConfigurationManager.GetSetting("SubscriptionName"); this.queueManager.ReceiveMessages(subscriptionName, this.ProcessMessage); ...; } ... protected virtual async Task ProcessMessage(BrokeredMessage message) { // Simulating processing. await Task.Delay(TimeSpan.FromSeconds(2)); } }
该 PriorityQueue.High 和 PriorityQueue.Low 辅助角色 既 覆盖 ProcessMessage的 方法的 默认功能 。 下面的代码显示 了 ProcessMessage的 方法 为 PriorityQueue.High 辅助角色 。
Copy protected override async Task ProcessMessage(BrokeredMessage message) { // Simulate message processing for High priority messages. await base.ProcessMessage(message); Trace.TraceInformation("High priority message processed by " + RoleEnvironment.CurrentRoleInstance.Id + " MessageId: " + message.MessageId); }
当一个应用程序 将消息发布 到 与 所使用的 PriorityQueue.High 和 PriorityQueue.Low 辅助角色 的 订阅 相关联的 主题 , 它指定了 优先 使用 优先级 的自定义 属性 ,如 在 下面的代码 示例 。 此代码 (这是 在 PriorityQueue.Sender 项目 WorkerRole 类实现 ) , 使用 的QueueManager 类的 SendBatchAsync 辅助方法 发帖 分批 的话题。
// Send a low priority batch. var lowMessages = new List<BrokeredMessage>(); for (int i = 0; i < 10; i++) { var message = new BrokeredMessage() { MessageId = Guid.NewGuid().ToString() }; message.Properties["Priority"] = Priority.Low; lowMessages.Add(message); } this.queueManager.SendBatchAsync(lowMessages).Wait(); ... // Send a high priority batch. var highMessages = new List<BrokeredMessage>(); for (int i = 0; i < 10; i++) { var message = new BrokeredMessage() { MessageId = Guid.NewGuid().ToString() }; message.Properties["Priority"] = Priority.High; highMessages.Add(message); } this.queueManager.SendBatchAsync(highMessages).Wait();
本文翻译自MSDN:http://msdn.microsoft.com/en-us/library/dn589794.aspx
原文:http://blog.csdn.net/yangzhenping/article/details/40889419
内容总结
以上是互联网集市为您收集整理的云计算设计模式(十六)——优先级队列模式全部内容,希望文章能够帮你解决云计算设计模式(十六)——优先级队列模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。