hey guys--
If you're using Tasks and haven't tried public, dynamic Backends yet,
they're wonderful:
- for tiny apps, you can offload another $0.72/day for free (they're
dynamic!)
- for medium apps, it's a super easy way to get more RAM
- easy migration from Tasks running on frontends to running them on
public, dynamic backends (incl development, debugging, etc.)
- nearly identical debugging/production methods as frontend Tasks
- since they're public, you can launch Tasks directly on the backend,
removing the frontend from the equation, e.g. you can test out how a
Task will perform on a backend, before committing to the architecture
change.
- cool trick: keep the fast Tasks running on frontends, and use the
(expensive) backends for RAM-intensive jobs-- this is a tiny code
change, and also makes it easier to debug large jobs because the
console isn't flooded with little jobs. For my app, I use Tasks for
various indexing jobs in an online marketplace-- now, I send the
"large" sellers with 1000s of SKUs, to a B4 backend.
GAE team:
- I've noticed that my backends can 500-error but not produce a stack
trace in the logs? are other people seeing this?
my choice of migration: (python)
1. create backends.xml, define *one* backend, e.g.
backends:
- name: backend2647324 # since it's public, give it a hard-to-
guess name
class: B4 # big+fast without blowing the free budget
options: dynamic, public
2. add backend-enabled queued, by copying queues from frontends:
queue:
- name: image-processor
...other options here...
- name: image-processor-backend # note how I append "-backend"
to the name
target: backend2647324
...other options here...
3. in your code, start firing Tasks at the backend
# see bottom for taskname() trick
taskqueue.add(url=..., name=taskname("some-identifier-i-will-
recognize"),
queue_name="image-thumbnailer"+("-backend" if
is_gigantic_image(...) else ""))
4. modify your deploy script to update both the front & backends.
Mine (legacy) is in perl:
# deploy bar ==> deploys to foo-bar and to foo-bar-backend
# deploy bar-backend ==> deploys to foo-bar-backend only
# deploy bar-frontend ==> deploys to foo-bar only
$DEST = pop(@ARGV);
my $push_frontend = 1;
if ($DEST =~ s/-backend//) { $push_frontend = 0; }
my $push_backend = 1;
if ($DEST =~ s/-frontend//) { $push_backend = 0; }
if ($push_frontend) {
open(FH, "echo ".$ENV{"GAEPASSWD"}."|python2.5 ".$ENV{"GAEDIR"}."/
appcfg.py --email=".$ENV{"GAEUSER"}." --passin --application=foo-$DEST
update .|");
while (<FH>) { print; }
close FH;
}
if ($push_backend) {
open(FH, "echo ".$ENV{"GAEPASSWD"}."|python2.5 ".$ENV{"GAEDIR"}."/
appcfg.py --email=".$ENV{"GAEUSER"}." --passin --application=foo-$DEST
backends . update|");
while (<FH>) { print; }
close FH;
}
that's it! now, some jobs will go to the frontends and others to the
backends.
hope this helps,
adam
def taskname(string):
"""safely create Google App Engine Task names."""
# add timestamp and random for ultimate uniqueness, strip disallowed
chars
rnd_salt = str(random.randint(100000, 999999))
return re.sub(r'[^a-zA-Z0-9-]', '-', string +
str(datetime.datetime.now())) + "-" + rnd_salt
--
You received this message because you are subscribed to the Google Groups
"Google App Engine" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/google-appengine?hl=en.