ActiveMq Prefetch

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActiveMq Prefetch相关的知识,希望对你有一定的参考价值。

参考技术A 然而,如果不限制每次push给消费者的消息个数将会是危险的,过多的消息会导致消费者客户端资源耗尽。尤其是当消息的消费速度显著慢于消息的分发速度时。而且如果不加以限制的话会导致消息被单一的消费者消费,其他消费者处于空闲状态,我们就遇到过这种情况,activemq默认的 缓冲区大小1000条message, 有时其中一个消费者缓冲区中有800多条message,而另一个消费者处于空闲状态,这就导致资源没有充分利用,而且降低了消息的处理速度。 为了避免这种情况,ActiveMQ使用预取极限(prefetch limit)来限制一次性分发给单个消费者的最大消息个数。消费者则使用预取极限(prefetch limit)来设置其消息缓冲区的大小。

可以在ActiveMQConnectionFactory或ActiveMQConnection上指定ActiveMQPrefetchPolicy的实例,具体有四个配置:

有两种方法可以配置prefetch limit:

前面也提到过,prefetch limit也不是越大越好,能够很快处理的Message,相应的consumer我们可以将prefetch limit设置的较大一点,而处理比较慢的Message,相应的consumer最好将prefetch limit设置为1,这可确保消费者一次只处理一条消息,Message不会pending到缓冲区,并且能够充分利用多个Message Consumer的资源。如果将prefetch limit设置为0,将导致consumer一次一个地轮询pull消息,而不是将消息push到消费者缓冲区,前面提到过这种方式会增加时延,间接的降低了消息的处理速度。

AttributeError:“Resume”对象没有“prefetch_related”属性

【中文标题】AttributeError:“Resume”对象没有“prefetch_related”属性【英文标题】:AttributeError: 'Resume' object has no attribute 'prefetch_related' 【发布时间】:2018-03-10 23:18:13 【问题描述】:

我试图了解 prefetch_related 和 select_related 用于优化的用途。我在博客的某处了解到,使用 prefetch 和 select 的地方之一是 prefetch_related 用于反向关系,而 select_related 用于正向关系。就我而言,有简历模型和教育模型。教育模型具有resume 的FK 和related_name 用于反向关系,而不是在查询时编写额外的_set。我需要用请求的用户简历列出请求用户的所有教育。我可以在没有以下优化技术的情况下做到这一点

education_instance = Resume.objects.get(applicant=request.user).educations.all()

当我尝试改用以下内容时,我得到了标题中所述的错误

education_instance = Resume.objects.filter(applicant=request.user).prefetch_related('educations')

这是我的模型

class Resume(models.Model):
    applicant = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=100, blank=False, null=False, help_text="Full Name")

class Education(models.Model):
    resume = models.ForeignKey(Resume, related_name='educations')
    name = models.CharField(max_length=100, blank=False, null=False, help_text="Name of an institution")

谁能用简单的外行术语让我清楚 select_related 和 prefetch_related 吗?我无法理解我遇到的问题

【问题讨论】:

【参考方案1】:

实际上,在这种情况下您应该使用 select_related。 据我所知,prefetch_related 用于多对多关系,它进行两个查询来检索对象,而 select_related 用于普通 fk 或一对一关系,它使用连接在一个查询中获取所有对象。

【讨论】:

【参考方案2】:

首先通过这个[prefetch_related的文档][1]

[1]:https://docs.djangoproject.com/en/1.11/ref/models/querysets/#prefetch-related那你会发现不能这样用

你必须申请教育模式

education_instance = Education.objects.filter(resume__applicant == request.user).prefetch_related('resume')

希望这会对你有所帮助。

【讨论】:

感谢您的解决方案。我一定会查看你们为我推荐的所有链接。在去那个链接之前,我不确定我是否会进入它,所以我想问一下 prefetch_related 里面的简历是什么。是 Education 表中的字段(fk)吗? yes resume in prefetch_related is fk in Education table.【参考方案3】:

What's the difference between select_related and prefetch_related in Django ORM?查看该帖子以了解选择相关和预取相关。

【讨论】:

【参考方案4】:

根据您提供的异常,您尝试在对象 Resume 上调用 .prefetch_related(),而不是 Resumes QuerySet

所以,请确保你运行

Resume.objects.filter(applicant=request.user).prefetch_related('educations')

不是

Resume.objects.get(applicant=request.user).prefetch_related('educations')

【讨论】:

这样我只得到一个查询而不是全部 @milan 你说的QuerySet是什么意思?

以上是关于ActiveMq Prefetch的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ知识概括

ActiveMQ知识概括

activemq连接过多导致变慢

为啥activemq有两个端口

ActiveMq入门实例

ActiveMQ入门实例