Best way to create an endless Background job?

Hello there,

I'm still "new" to ruby on rails, i try to create a little
browsergame. For that, I have to control the "resources" of a village.
For example:
The village got a wood rate of 200 per hour, so i want to call every
hour a method/action (anything) that count the 200 to the rest wood.
But of course, i need to do this with every village.

Since yet I did some easy code with delayed job and it all worked
fine, but now i think about how to create this big background job. One
option to start it would be at the first creation of a village but
how? But i thought about it, setting it up with delayed job and
running an method that check hundreds of villages, it sounds a little
nonproductive and a waste of time.
Btw. that would mean, that one worker is all the time busy and can't
do anything else or not? I mean thats really annoying cause he is
frozen for the most time - doing nothing. What of course mean i need a
second worker and then heroku is not "for free" anymore?
So what do you think is the best way(with or without delayed_job) to
handle this job?

Has anyone an example site which had the same problem?

Ps: is there a way to start the code every full hour? I think using
sleep could be a second problem with many villages. For that long
running code it wouldn't be anymore "every full hour" it would turn in
every hour and a half, or not?

Greetings
Genji

Genji wrote in post #1016820:

Hello there,

I'm still "new" to ruby on rails, i try to create a little
browsergame. For that, I have to control the "resources" of a village.
For example:
The village got a wood rate of 200 per hour, so i want to call every
hour a method/action (anything) that count the 200 to the rest wood.
But of course, i need to do this with every village.

Since yet I did some easy code with delayed job and it all worked
fine, but now i think about how to create this big background job. One
option to start it would be at the first creation of a village but
how? But i thought about it, setting it up with delayed job and
running an method that check hundreds of villages, it sounds a little
nonproductive and a waste of time.
Btw. that would mean, that one worker is all the time busy and can't
do anything else or not? I mean thats really annoying cause he is
frozen for the most time - doing nothing. What of course mean i need a
second worker and then heroku is not "for free" anymore?
So what do you think is the best way(with or without delayed_job) to
handle this job?

It sounds like you could use a Queue with one worker. Of course with
only one worker the tasks you add to the Q can only be executed one at a
time

Has anyone an example site which had the same problem?

Ps: is there a way to start the code every full hour?

cron job.

Hello there,

I’m still “new” to ruby on rails, i try to create a little

browsergame. For that, I have to control the “resources” of a village.

For example:

The village got a wood rate of 200 per hour, so i want to call every

hour a method/action (anything) that count the 200 to the rest wood.

But of course, i need to do this with every village.

Since yet I did some easy code with delayed job and it all worked

fine, but now i think about how to create this big background job. One

option to start it would be at the first creation of a village but

how? But i thought about it, setting it up with delayed job and

running an method that check hundreds of villages, it sounds a little

nonproductive and a waste of time.

Btw. that would mean, that one worker is all the time busy and can’t

do anything else or not? I mean thats really annoying cause he is

frozen for the most time - doing nothing. What of course mean i need a

second worker and then heroku is not “for free” anymore?

So what do you think is the best way(with or without delayed_job) to

handle this job?

Has anyone an example site which had the same problem?

Ps: is there a way to start the code every full hour? I think using

sleep could be a second problem with many villages. For that long

running code it wouldn’t be anymore “every full hour” it would turn in

every hour and a half, or not?

Everytime the page loads, compute the total resources of the user based on the last time

you updated the resources of that user. Then add a js that would send an ajax request

that would update the resources. No background job needed. So for example, a user last

logged out at 7:00 PM. The next day, that same user logged in at 7:30 AM. That would mean

that that user’s resources should increase by 12 hours worth of resources and your js should

fire after 30 mins.

Jim ruther Nill wrote in post #1016826:

Everytime the page loads

The user could have the page open for two hours. What then?

Jim ruther Nill wrote in post #1016826:

Everytime the page loads

The user could have the page open for two hours. What then?

After the js fires, set that same script to run after 1 hour.

Hi,

    I think the best will be to set the os scheduler to launch a

ruby script every hour to execute the task. I try to use
delayed_jobs only when a user launches / start a process that is too
big / too long and will affect the user experience.

    Good luck!

Create an endpoint and call it using external cron service.

http://www.setcronjob.com/

+1 for Jim Ruther Hills recommendation.

Thank you for the answers.

Using a scheduler or a external cron service still means to use a
worker, right?
But would the "js - way" need a worker for that task? (js means java
script or not?)
The problem is just that i never did something with javascript...
So maybe i could set it up like Jim said and using the rufus-scheduler
in place of js (https://github.com/jmettraux/rufus-scheduler )?
But there is one question left.
Would this be more productive? I still have to check every user to
know who is logged in and who is not. Would java script change this?
Right now it would be:
one process for all users -- long running
would java script change it to :
one process for one user without a background worker?

btw: Cronjob sounds great for checking the points of the players...

Thank you for the answers.

Using a scheduler or a external cron service still means to use a

worker, right?

But would the “js - way” need a worker for that task? (js means java

script or not?)

The problem is just that i never did something with javascript…

So maybe i could set it up like Jim said and using the rufus-scheduler

in place of js (https://github.com/jmettraux/rufus-scheduler )?

But there is one question left.

Would this be more productive? I still have to check every user to

know who is logged in and who is not. Would java script change this?

Right now it would be:

one process for all users – long running

would java script change it to :

one process for one user without a background worker?

btw: Cronjob sounds great for checking the points of the players…

The main reason I suggested using js is so that the user’s view will

always be updated and/or correct. Having a background job do the

updates will only update the database. The user still has to refresh

the page to get the current amount of resources. Or you’d still have

to update the page via ajax so that the values are updated.

To answer your question, a js will at most send 1 request to your server

every hour, which is much more acceptable than sending a request to

the server every minute just so that the server can update the resources’

values via ajax.

Thank you for the answers.

Using a scheduler or a external cron service still means to use a

worker, right?

But would the “js - way” need a worker for that task? (js means java

script or not?)

The problem is just that i never did something with javascript…

So maybe i could set it up like Jim said and using the rufus-scheduler

in place of js (https://github.com/jmettraux/rufus-scheduler )?

But there is one question left.

Would this be more productive? I still have to check every user to

know who is logged in and who is not. Would java script change this?

Right now it would be:

one process for all users – long running

would java script change it to :

one process for one user without a background worker?

btw: Cronjob sounds great for checking the points of the players…

The main reason I suggested using js is so that the user’s view will

always be updated and/or correct. Having a background job do the

updates will only update the database. The user still has to refresh

the page to get the current amount of resources. Or you’d still have

to update the page via ajax so that the values are updated.

To answer your question, a js will at most send 1 request to your server

every hour, which is much more acceptable than sending a request to

the server every minute just so that the server can update the resources’

values via ajax.

One thing to keep in mind with the JavaScript method is that if a person wants to cheat they may be able to fake extra js requests. For multiplayer this may be a problem. Easily handled with a little extra checking on the server when the requests come in, though.

-r