Why upgrade from Objectify v5 to v6? - google-app-engine

Seems like there is a lot of work to upgrade from objectify v5 to v6 since there are many breaking changes. Is there a good reason to do that work and upgrade?

Just for the sake of having a bigger version number? No, I wouldn't upgrade; your code works fine now and at best it will work fine after. There are two major developments you probably want to wait for:
Cloud Datastore integration with Cloud Tasks (not to mention Cloud Tasks coming out of beta), so you can transactionally enqueue tasks.
gRPC in the SDK to improve the performance of calls.
Starting a new project is a harder question... but I would stay with "if it isn't broken don't fix it" for existing codebases. The appengine sdk and Objectify v5 are mature APIs that work, and upgrading later shouldn't be any harder than upgrading now (quite a lot easier if you use transactional tasks).
Note that if you want to move your application to the GAE Flexible Runtime then you need v6, but this is just one of many changes you will probably need.

Objectify v5 uses the App Engine SDK to connect to the GAE services, via a proprietary interface called ApiProxy. Google then released the Cloud SDK, which introduces improvements, but most important for this case, it replaces this interface with REST and GRPC interfaces to their services. These are the interfaces Objectify v6 uses.
If, for deployment, you are using appcfg or mvn appengine:update, you are still using the old App Engine SDK, but, if you either use mvn appengine:deploy or gradle appengineDeploy, you are using the Cloud SDK.
While it does make sense to keep using Objectify v5 if you are using the old App Engine SDK, it is best to upgrade to both the Cloud SDK and Objectify v6, since the Cloud SDK looks like the way to go for future App Engine deploments.
There is a guide on how to move from v5 to v6, and the equivalence between some commands in Appcfg and Gcloud.

Related

How to test Google App Engine app locally with Hot Reloading and other supported libraries?

In the past, we can test GAE apps with dev_appserver.py [/path/to/my-project]. This was very useful because it provided helpful error messages in the terminal.
With the advent of gcloud SDK, it is suggested that we set up a virtualenv and test apps locally by running python main.py. Is this the recommended way for large apps too? Or is this just a quick-start way to demonstrate how to run App Engine locally?
What is the suggested local environment for building production-ready GAE apps?
The SDK was previously providing a local dev_appserver since the App Engine Standard 1st generation environment was integrating built-in APIs (Datastore, Memcache, etc...) that needed to be emulated locally to properly run/test your application.
The 2nd generation now deprecated these built-in APIs and rely on Cloud Client Libraries (more info on the runtime differences here). This means that you don't need anymore an emulated environment for your local testing. Your application, either large or small, should be able to run indifferently locally and when deployed.

Why did Google remove Image API for App Engine running Python 3.7?

I am using Google Cloud Storage and I want to serve scaled images from it, Python 2 version of Google App Engine supported it via Images API but with Python3, they removed that API.
https://cloud.google.com/appengine/docs/standard/python3/python-differences
Cannot understand the intension behind removing such an import feature, upgrading to Python3 in Google Cloud environment sounds like a downgrade to me.
As you said, the proprietary App Engine APIs are not available in Python3.7. The main reason is because GCP is unbundling App Engine and now, you are no longer dependent on these APIs.
Currently, there are some third parties alternative solutions. In your specific case, and based on GCP documentation, I think that you can try to use Imgix or Rethumb.
Seems like Google is planning on adding it back to Python 3:
https://cloud.google.com/appengine/docs/standard/python3/services/access
To reduce runtime migration complexity, Google Cloud now supports a set of App Engine bundled services and their associated APIs on second-generation runtimes, which include Python 3, Java 11, and Go 1.12 or higher. Your app can call bundled services APIs for second-generation runtimes through language-idiomatic libraries.

Are there any caveats in using Objectify with Google Cloud Endpoints on App Engine Java?

I'm developing an app on Appengine & Android, and am planning to use Google Cloud Endpoints for the API and GCM for the communications between the cloud and mobile. I had intended to use Objectify for the data persistence, but am wondering if I will run into unexpected trouble with it - particularly with different annotations, or other requirements. Does anyone have any experience they can warn me about?
Objectify is considered a supported framework for use with Endpoints, so if you encounter issues, they'd be viewed as bugs. A number of trusted testers have been using it with success.
I've been working with Objectify and Endpoints for a couple of months now. The project setup was a bit tricky, and in the end I gave up using the Eclipse Endpoint plugins, as it was proving difficult to debug. Instead I used this excellent example https://github.com/GoogleCloudPlatform/appengine-endpoints-helloendpoints-java-maven by Dan as a starting point. Using Eclipse for Java coding and command line for compiling. Using Maven & command line gives reliable and helpful feedback. Use command mvn help:describe -Dplugin=appengine for available options.
Once you have your Maven Endpoints project setup, adding Objectify to Maven is trivial. Objectify and supporting documentation is extremely straight forward and works well with Endpoints. The only hiccup I had was that Endpoints blow up if Keys and Refs aren't annotated with #ApiResourceProperty(ignored = AnnotationBoolean.TRUE).

why is javascript node.js not on google app engine

Google created the V8 JavaScript engine: V8 compiles JavaScript source code directly into machine code when it is first executed.
Node.js is built on V8 - why is Google not offering any Node.js servers like Microsoft Azure?
Google App Engine would be a natural place to put Node.js.
Do you know why Google is not doing just that?
Node.js is maintained by Joyent, who is in a way a competitor of Google.
Node.js has no link what so ever with Google but is in fact built on top of an open source project started by Google.
Google might jumped into this business just like Azure did, but there are already so many PaaS doing it, it might not be worth it. I have never used GAE, but my understanding is that it is quite different that other PaaS and you have to use GAE libraries to make your code run.
Which, this is my personal feeling, is not really what the Node.js community is looking for.
Node.js is used to quickly make a fast lightweight app, a big share for APIs for Phone apps for example.
Nevertheless if you are looking for a PaaS for Node.js, the are quite a few out there:
Joyent (nodejitsu)
dotCloud which has WebSockets support.
Windows Azure
Nodester (bought by App Fog recently)
Any Cloud Foundry host should support Node.js too.
and many more...
Those are just some names off the top of my head. There quite a few but those are the major ones.
Oh there is Heroku too, but they don't have support for WebSocket which is a bummer for any Socket.IO based app.
As of June 2014, Google had a limited preview for custom languages on Google App Engine (which is different from Google Compute Engine).
Watch Building Node.js applications with App Engine and Custom Runtimes and check out https://cloud.google.com/appengine/docs/managed-vms/:
App Engine now offers a second hosting option: Managed VMs. The Managed VM hosting environment lets you run App Engine applications on configurable Compute Engine Virtual Machines (VMs).
You can also use Managed VMs to deploy user-configurable custom runtimes, such as for Node.js and other runtimes.
The procedure to get into the beta is:
Sign up and create a Managed VM project
Managed VMs are in Limited Preview, you must sign up for access to this feature, create a billing-enabled project, and tell us about your project so we can whitelist it to run in a Managed VM. Follow these steps:
Sign up for access to Managed VMs.
Join the app-engine-managed-vms Google Group to participate in discussions about Managed VMs.
Projects (or apps - they are the same thing) must be in a U.S. data center. If you're planning to use an existing project, skip to the next step. Otherwise, create a new app in a U.S. data center. Navigate to https://preview.appengine.google.com and create a new app.
Enable billing for the project. Visit the page https://cloud.google.com/console/project/apps~, where is the ID of your project. Click on Settings in the left menu and then enable billing. If your app is billed under a Premier account, email us at app-engine-managed-vm-tt-id#google.com to have your new Cloud project billed under the same account.
Send an email to app-engine-managed-vm-tt-id#google.com with the application ID in the subject line.
When we receive your email, we’ll configure some resources behind the scenes and notify you via email when your project is ready to go. The email includes final instructions for setup. If you encounter an error while following these instructions, contact us at app-engine-managed-vm-tt-id#google.com.
You can easily install node on Google Compute Engine (which basically is a virtual computer). Here is a link:
https://developers.google.com/datastore/docs/getstarted/start_nodejs/
Regards
Lars
after years of experiences in google appengine, i switch to other cloud services now.
i think google appengine is actually an old fashion service in cloud computing industry. which is slow to new technology, difficult to deploy, time wasting to learn the apis and lacking of a lot of features you need in languages you use.
regardless of google's large community, i would not suggest anyone to use google appengine.
[newer paas]
i strongly recommend you to use openshift, appfog, heroku .etc's new paas cloud computing technologies, which are far more extensible, less change needing, more migrable from one platform to another, more freely coding in the beauty of the natural lanuage and its standard libraries without ugly platform specific apis.
[iaas]
if you want more control over the running os environment, you may give linode, digital ocean, amazon, google cloud engine, microsoft azure etc. iaas providers a try.
Because App Engine is a platform-as-a-service, and in order to add a new language/stack to GAE, Google need to create mid-level libraries that interface with the plethora of App Engine's services.
Moreover, all App Engine apps is sandboxed and has several functionalities restricted from inside their sandbox environment. This means that beside the need to create service libraries, Google also need to create a secured sandbox environment for any language/stack that they try to introduce into GAE.
I personally think the second reason is why Google does not introduce support for new language/stack as aggressive as Azure did. App Engine is, in a way, more 'managed' than Azure, and has a larger initial development cost for new language/stack.
It has been released as of March 2016.
https://cloudplatform.googleblog.com/2016/03/Node.js-on-Google-App-Engine-goes-beta.html
Node.js has recently enabled support for Google Cloud users. The main document pages are:
Node.js on Google Cloud Platform
Google Cloud Datastore — Google Developers
It seems to require at the moment a Compute Engine instance.
Background: App Engine Standard vs App Engine Flexible
There seems to be some confusion on this topic because there are two versions of App Engine: Standard and Flexible. NodeJS is supported on App Engine Flexible but NOT on App Engine Standard. (See here for a more complete explanation of the differences).
App Engine Standard scales in seconds (as opposed to minutes for the Flexible environment), and has a free tier, so you can develop and demo without spending a dime. These benefits come at the cost of flexibility. App Engine Standard only supports certain languages and libraries, doesn't allow writing to disk nor SSH. In other words, the environment is standardized.
Answer: NodeJS Support on App Engine Standard
If you are interested in NodeJS support on App Engine Standard, please star this issue: https://issuetracker.google.com/issues/67711509.
Google addresses features that get attention from the community (see here). The best way to give your attention to this feature, is to star it on the Google Issue tracker linked to above.
Google announced on March, 21st 2016 that Node.js on Google App Engine was going beta: https://cloudplatform.googleblog.com/2016/03/Node.js-on-Google-App-Engine-goes-beta.html?m=1
This was expected as Google also joined the Node.js Foundation and Google develops the V8 JavaScript engine which powers Chrome and Node.js: https://nodejs.org/en/blog/announcements/welcome-google/
Google announced a partnership with NodeSource at the same time.
Google has just announced support for Node.js on App Engine.
See: https://cloud.google.com/nodejs/
Here's an example of how to deploy Node.js app on App Engine.
Google is a software-conservative company. Programming a backend in JavaScript would be absolutely unimaginable for Google's managers. Creating infrastructure Google itself won't be using is not a good investment. Reference: Notes from the Mystery Machine Bus
(Jun 2021) This question is almost a decade old, and many things have changed since the OP. TL;DR: JavaScript and/or Node.js are supported in 6 different serverless compute platforms from Google: 4 on GCP and one each from Google Workspace and Firebase plus release dates:
Google App Engine - Standard (Jun 2018) - announcement, docs (Node.js 10, 12, 14; 8 is deprecated)
Google App Engine - Flexible (Mar 2016) - announcement (general release), docs (Most Node.js versions)
Google Cloud Functions (Mar 2017) - announcement (general release), docs (Node.js 10, 12, 14; 8 is deprecated)
Cloud Functions for Firebase (Mar 2017) - announcement, docs (same versions as Google Cloud Functions)
Google Cloud Run (Apr 2019) - announcement (general release), docs (Any Node.js version you can put in a container)
Google Apps Script (Aug 2009) - announcement, docs (JS-only, not Node; Rhino ES3/ES5 + extensions originally; now v8 & ES6+ [Mar 2020])
Also see Google Cloud's overall support of/for Node.js.

Port a live system from App Engine Helper to App Engine Patch

I am running a live system that is currently serving about 20K pages a day which is based on App Engine Helper (Python) with session support provided by AppEngine utilities.
One problem that I have been having is that sessions are occasionally randomly logging out. I would like to try using the App Engine Patch, since it has "native" django session support, but I am worried that this is possibly going to be like doing a brain transplant. Specifically, current database models are all inhereted from BaseModel provided by the App Engine Helper. While, App Engine Patch does not have this inheritance.
Does anyone know if it is possible to migrate a live system from App Engine Helper to App Engine Patch? If so, do you have any advice or warnings that I should heed, before attempting this transition?
Thank you and kind regards
Alex
After further investigations, I discovered that newer versions of Django and App Engine Helper have built in support for sessions. After migrating to this system, my problems of randomly losing sessions have been resolved.
Alex
You should think about porting your system not to App Engine Patch but to Django-nonrel (by app-engine-patch authors).
I moved from google-app-engine-django and app-engine-patch to Django-nonrel is because first two are not maintained any more.

Resources