Develop
The StreamNative cloud will find theprocess method from the NodeJs function file, below is an example:
Avro and Json schema record, for Avro scheme input and output:
Json input and output:
Feature Matrix
The NodeJs runtime doesn’t support full features comparing to Java runtime, and it’s still in developing, below is the matrix:Input Arguments
| Input | Java | Go(Pulsar) | Python | NodeJs |
|---|---|---|---|---|
| Custom SerDe | ✅ | ❌ | ✅ | ✅ |
| Schema - Avro | ✅ | ❌ | ✅ | ✅ |
| Schema - JSON | ✅ | ❌ | ✅ | ✅ |
| Schema - Protobuf | ✅ | ❌ | ❌ | ❌ |
| Schema - KeyValue | ✅ | ❌ | ❌ | ❌ |
| Schema - AutoSchema | ✅ | ❌ | ❌ | ❌ |
| Scehma - Protobuf Native | ✅ | ❌ | ❌ | ❌ |
| e-2-e encryption | ✅ | ❌ | ✅ | ✅ |
| maxMessageRetries | ✅ | ❌ | ❌ | ✅ |
| dead-letter policy | ✅ | ❌ | ❌ | ✅ |
| SubscriptionName | ✅ | ✅ | ✅ | ✅ |
| SubscriptionType | ✅ | ✅ | ✅ | ✅ |
| SubscriptionInitialPosition | ✅ | ❌ | ✅ | ✅ |
| AutoAck | ✅ | ✅ | ✅ | ✅ |
Output Arguments
| Output | Java | Go(Pulsar) | Python | NodeJs |
|---|---|---|---|---|
| Custom SerDe | ✅ | ❌ | ✅ | ✅ |
| Schema - Avro | ✅ | ❌ | ✅ | ✅ |
| Schema - JSON | ✅ | ❌ | ✅ | ✅ |
| Schema - Protobuf | ✅ | ❌ | ❌ | ❌ |
| Schema - KeyValue | ✅ | ❌ | ❌ | ❌ |
| Schema - AutoSchema | ✅ | ❌ | ❌ | ❌ |
| Schema - Protobuf Native | ✅ | ❌ | ❌ | ❌ |
| useThreadLocalProducers | ✅ | ❌ | ❌ | ✅ |
| Key-based Batcher | ✅ | ✅ | ✅ | ✅ |
| e-2-e encryption | ✅ | ❌ | ✅ | ✅ |
| Compression | ✅ | ✅ | ✅ | ✅ |
Context
| Context | Java | Go(Pulsar) | Python | NodeJs |
|---|---|---|---|---|
| InputTopics | ✅ | ✅ | ✅ | ✅ |
| OutputTopic | ✅ | ✅ | ✅ | ✅ |
| CurrentRecord | ✅ | ✅ | ✅ | ✅ |
| OutputSchemaType | ✅ | ❌ | ✅ | ✅ |
| Tenant | ✅ | ✅ | ✅ | ✅ |
| Namespace | ✅ | ✅ | ✅ | ✅ |
| FunctionName | ✅ | ✅ | ✅ | ✅ |
| FunctionId | ✅ | ✅ | ✅ | ✅ |
| InstanceId | ✅ | ✅ | ✅ | ✅ |
| NumInstances | ✅ | ❌ | ✅ | ✅ |
| FunctionVersion | ✅ | ✅ | ✅ | ✅ |
| PulsarAdminClient | ✅ | ❌ | ❌ | ❌ |
| GetLogger | ✅ | ❌ | ✅ | ✅ |
| RecordMetrics | ✅ | ✅ | ✅ | ❌ |
| UserConfig | ✅ | ✅ | ✅ | ✅ |
| Secrets | ✅ | ❌ | ✅ | ✅ |
| State | ✅ | ❌ | ❌ | ✅ |
| Publish | ✅ | ✅ | ✅ | ✅ |
| ConsumerBuilder | ✅ | ❌ | ❌ | ❌ |
| Seek / Pause / Resume | ✅ | ❌ | ❌ | ❌ |
| PulsarClient | ✅ | ❌ | ❌ | ❌ |
Other
| Other | Java | Go(Pulsar) | Python | NodeJs |
|---|---|---|---|---|
| Resources | ✅ | ✅ | ✅ | ✅ |
| At-most-once | ✅ | ✅ | ✅ | ✅ |
| At-least-once | ✅ | ✅ | ✅ | ✅ |
| Effectively-once | ✅ | ❌ | ✅ | ❌ |
Package
You can either provide a single.js file or package your function into a .zip file when creating NodeJs functions.
A zip file should contain:
- the
pacakge.jsonfile - other source code file
package.json:
package.json:
package.json and handle your function.
Deploy
After creating a cluster, set up your environment and develop&package your function, you can use thesnctl, pulsarctl, pulsar-admin command, the REST API, or terraform to deploy a Pulsar function to your cluster.
You can create a NodeJs Pulsar function by using a local .js or .zip file or an uploaded Pulsar functions package(recommend).
(Optional) Upload your function file to Pulsar
It’s recommend to upload your function file to Pulsar before you create a function. Since you can add a version suffix to the package.- snctl
- Pulsarctl
- Pulsar-admin
Upload packagesYou should see the following output:
Create
- snctl
- Pulsarctl
- Pulsar-admin
- Terraform
- REST API
Since Pulsar doesn’t support NodeJs runtime, we need to use
--py to specify the function file and specify the --custom-runtime-options '{"genericKind": "nodejs"}' to make it work.What’s next?
- Learn how to develop WASM functions.
- Learn how to manage functions.
- Learn how to monitor functions.
- Reference common configurations.