Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中实现负载平衡_Python_Django - Fatal编程技术网

Python 在Django中实现负载平衡

Python 在Django中实现负载平衡,python,django,Python,Django,我正在尝试使用循环方法在Django中实现负载平衡。首先,我创建了一个模型,其中保存了所有实例和每个实例的序列 我的模型: class Load_Balancing(models.Model): id = models.AutoField(primary_key=True) instance = models.CharField(max_length=100) sequence = models.IntegerField() 不要试图在应用程序级别实现负载平衡,因为这毫

我正在尝试使用循环方法在Django中实现负载平衡。首先,我创建了一个模型,其中保存了所有实例和每个实例的序列

我的模型:

class Load_Balancing(models.Model):
    id = models.AutoField(primary_key=True)
    instance = models.CharField(max_length=100)
    sequence = models.IntegerField()

不要试图在应用程序级别实现负载平衡,因为这毫无意义。 您的数据库将成为解决方案的瓶颈


使用合适的HTTP服务器/反向代理大多数都有完善的负载平衡支持,例如:,

不要尝试在应用程序级别实现负载平衡,因为这毫无意义。 您的数据库将成为解决方案的瓶颈


使用合适的HTTP服务器/反向代理大多数都有完善的负载平衡支持,例如:,

不知道您的意图,在视图中获取一个实例并使用它执行任何进一步的操作,下面可能是一个简单的PoC来实现这一点

然而,我强烈建议您使用iklinac的解决方案,并重新考虑您的架构设计

您可以创建一个用作计数器的模型。 请注意,这也可以使用内存持久性解决方案(如pickle)完成,但我更喜欢这样做

创建一个用作计数器的表

class InstanceSq(models.Model):
    sequence_id = models.IntegerField()
此模型的表始终仅包含一行

在your views.py中获取它,如下所示:

try:
    sequence_id = InstanceSq.objects.get(id=1).sequence_id
except InstanceSq.DoesNotExist:
    #This is when it runs first time
    instance_row = InstanceSq(sequence_id = 1)
    instance_row.save()
    sequence_id = 1

#..
#Here you get the current instance as:
instance_ip = Load_Balancing.objects.filter(sequence=sequence_id)
#Use your instance here and do whatever you want to do
#.. and then
# Rotation logic
new_id = sequence_id % 4 + 1
current = InstanceSq.objects.select_for_update().get(id=1) #to avoid race conditions
current.sequence_id = new_id
current.save()

在不知道您的意图的情况下,在视图中获取一个实例并对其执行任何进一步的操作,下面可能是一个简单的PoC来实现这一点

然而,我强烈建议您使用iklinac的解决方案,并重新考虑您的架构设计

您可以创建一个用作计数器的模型。 请注意,这也可以使用内存持久性解决方案(如pickle)完成,但我更喜欢这样做

创建一个用作计数器的表

class InstanceSq(models.Model):
    sequence_id = models.IntegerField()
此模型的表始终仅包含一行

在your views.py中获取它,如下所示:

try:
    sequence_id = InstanceSq.objects.get(id=1).sequence_id
except InstanceSq.DoesNotExist:
    #This is when it runs first time
    instance_row = InstanceSq(sequence_id = 1)
    instance_row.save()
    sequence_id = 1

#..
#Here you get the current instance as:
instance_ip = Load_Balancing.objects.filter(sequence=sequence_id)
#Use your instance here and do whatever you want to do
#.. and then
# Rotation logic
new_id = sequence_id % 4 + 1
current = InstanceSq.objects.select_for_update().get(id=1) #to avoid race conditions
current.sequence_id = new_id
current.save()

我相信有更好的方法可以做到这一点,但您可以保留另一个保留计数器变量的表。对于每个传入请求,您都可以为当前计数器设置为的实例提供服务。使用增量计数器1并保存后。一旦计数器达到4,它将以循环方式重置为0。如果这听起来像是一种方式,请让我知道,我可以用answeryes向您展示这方面的PoC。我觉得不错。@Mohitcan您可以在回复中发送它吗@MohitC?Posted,如果它对你有帮助,请接受并投票。我相信有更好的方法可以做到这一点,但你可以保留另一个保留计数器变量的表。对于每个传入请求,您都可以为当前计数器设置为的实例提供服务。使用增量计数器1并保存后。一旦计数器达到4,它将以循环方式重置为0。如果这听起来像是一种方式,请让我知道,我可以在回答中为您显示一个PoC。是的,对我来说很好。@Mohitcan您可以在答复中发送它@MohitC?Posted,accept和upvote(如果有帮助的话)。这将在更新时生成比赛条件,另一件事是丑陋的逻辑可以用模->新的\u id=sequence\u id%4+1替换。它有缺点,但我还是投了赞成票effort@iklinac,谢谢,更新了您的旋转逻辑。使用更新不会生成任何竞争条件,您可以从django文档中验证它,让我解释一下,您在更新对象之前获得了该对象,让我们使用多个并发用户。他们都将获得id,比如说3,并尝试将其更新为4。缓解以下问题的一种方法是使用select_for_update这将在更新时生成竞争条件,另一种方法是,丑陋的逻辑可以替换为modulo->new_id=sequence_id%4+1。它有缺点,但我还是投了赞成票effort@iklinac,谢谢,更新了您的旋转逻辑。使用更新不会生成任何竞争条件,您可以从django文档中验证它,让我解释一下,您在更新对象之前获得了该对象,让我们使用多个并发用户。他们都将获得id,比如说3,并尝试将其更新为4。缓解以下问题的方法之一是使用select_for_更新