Skip to content
This repository was archived by the owner on Jan 27, 2021. It is now read-only.

Commit 01650ec

Browse files
committed
split example file
1 parent 3010e61 commit 01650ec

File tree

5 files changed

+106
-70
lines changed

5 files changed

+106
-70
lines changed

README.md

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,19 @@ For ChangeStreamOptions, [startAtOperationTime](https://docs.mongodb.com/manual/
1313

1414
## Concepts
1515

16-
Mongo Replicator is built on structure of Collector, Replicator and Operator.
16+
Mongo Replicator consists of Collector, Replicator and Operator.
1717

1818
### Collector
1919

20-
Collector represent the data source to watch.
20+
Collector represents the data source to watch.
2121

2222
You can set the watch scope when creating a Collector instance. According to the params, the data source can be a deployment (either a replica set or a sharded cluster), several databases or collections.
2323

2424
```go
2525
NewCollector(uri string, databases []string, collections []string) *Collector
2626
```
2727

28-
The Collector instance has a `Collect` method to perform the watch action.
28+
Collector has a `Collect` method to perform the watch action.
2929

3030
```go
3131
(c *Collector) Collect(opts ...*options.ChangeStreamOptions) (*mongo.ChangeStream, error)
@@ -43,7 +43,7 @@ func (r *Replicator) Replicate(e model.ChangeEvent) error
4343

4444
### Operator
4545

46-
Operator defined the functions need to be implemented for the target container to replicate data.
46+
Operator interface defined the methods need to be implemented for the target container to deal with [change event](https://docs.mongodb.com/manual/reference/change-events/) documents.
4747

4848
```go
4949
type Operator interface {
@@ -60,16 +60,10 @@ type Operator interface {
6060

6161
You can implement your own Operator to customize the replication logic.
6262

63-
## Getting Started
63+
## Usage and Example
6464

65-
Import packages of Mongo Replicator into your project.
66-
67-
```go
68-
import "github.com/whhe/mongo-replicator"
69-
```
70-
71-
See [example_test.go](example_test.go) for reference.
65+
See [example](example_test.go) and [godoc](https://godoc.org/github.com/whhe/mongo-replicator) for reference.
7266

7367
## License
7468

75-
Mongo Replicator is released under the Apache 2.0 license. See [LICENSE](LICENSE)
69+
[Apache 2.0 License](LICENSE)

collector_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package replicator_test
2+
3+
import (
4+
"context"
5+
"log"
6+
7+
"github.com/whhe/mongo-replicator"
8+
)
9+
10+
var collector = &replicator.Collector{}
11+
12+
func doCollect(*replicator.Collector) {}
13+
func newCollectorFunc() *replicator.Collector { return collector }
14+
15+
func ExampleNewCollector() {
16+
// set source mongodb and watch scope
17+
uri := "mongodb://username@password@host:port"
18+
db := []string{"db"}
19+
coll := []string{"coll_1", "coll_2"}
20+
21+
collector := replicator.NewCollector(uri, db, coll)
22+
23+
doCollect(collector)
24+
}
25+
26+
func ExampleCollector_Collect() {
27+
collector := newCollectorFunc()
28+
29+
stream, err := collector.Collect()
30+
if err != nil {
31+
log.Fatal(err)
32+
}
33+
defer stream.Close(context.TODO())
34+
35+
// ... do some work ...
36+
}

example_test.go

Lines changed: 18 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,42 @@ import (
44
"context"
55
"log"
66

7-
"go.mongodb.org/mongo-driver/bson"
8-
97
"github.com/whhe/mongo-replicator"
108
"github.com/whhe/mongo-replicator/model"
11-
"github.com/whhe/mongo-replicator/operator/mongo"
12-
"github.com/whhe/mongo-replicator/token/redis"
139
)
1410

15-
var changeEvent = model.ChangeEvent{}
16-
var newResumeToken = bson.Raw{}
11+
var exampleReplicator = &replicator.Replicator{}
12+
13+
func newReplicatorFunc() *replicator.Replicator { return exampleReplicator }
1714

18-
func ExampleNewCollector() {
19-
// set source mongodb and watch scope
20-
uri := "mongodb://username@password@host:port"
21-
db := []string{"db"}
22-
coll := []string{"coll_1", "coll_2"}
15+
func Example() {
16+
// create a collector
17+
collector := newCollectorFunc()
2318

24-
// create a collector instance and start collecting change stream
25-
collector := replicator.NewCollector(uri, db, coll)
19+
// start collecting change streams
2620
stream, err := collector.Collect()
2721
if err != nil {
2822
log.Fatal(err)
2923
}
3024
defer stream.Close(context.TODO())
3125

32-
// iterate the change stream and do some work with the change event document until
33-
// the change stream is closed by the server or there is an error getting the next event
26+
// create a replicator
27+
repl := newReplicatorFunc()
28+
29+
// iterate the change stream and sync change event until the change stream is
30+
// closed by the server or there is an error getting the next event document
3431
for {
3532
if stream.TryNext(context.TODO()) {
3633
var event model.ChangeEvent
3734
if err := stream.Decode(&event); err != nil {
3835
log.Fatal(err)
3936
}
40-
// ... do some work ...
37+
38+
// replicate data using change event
39+
if err := repl.Replicate(event); err != nil {
40+
log.Fatal(err)
41+
}
42+
4143
continue
4244
}
4345

@@ -50,44 +52,3 @@ func ExampleNewCollector() {
5052
}
5153
}
5254
}
53-
54-
func ExampleNewReplicator() {
55-
// create an mongo operator to be used by the replicator
56-
mo, err := mongo.NewOperator("mongodb://localhost:27017")
57-
if err != nil {
58-
log.Fatal(err)
59-
}
60-
61-
// create a replicator instance and replicate a change event
62-
repl := replicator.NewReplicator(mo)
63-
err = repl.Replicate(changeEvent)
64-
if err != nil {
65-
log.Fatal(err)
66-
}
67-
}
68-
69-
func ExampleNewTokenManager() {
70-
// set redis uri and resume token key
71-
uri := "redis://:password@host:port/db"
72-
key := "resumeToken"
73-
74-
// create a token manager instance
75-
manager, err := redis.NewTokenManager(uri, key)
76-
if err != nil {
77-
log.Fatal(err)
78-
}
79-
defer manager.Close()
80-
81-
// get the latest resume token
82-
resumeToken, err := manager.Get()
83-
if err != nil {
84-
log.Fatal(err)
85-
}
86-
log.Print("resume token:", resumeToken)
87-
88-
// save the latest resume token
89-
err = manager.Set(newResumeToken)
90-
if err != nil {
91-
log.Fatal(err)
92-
}
93-
}

replicator_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package replicator_test
2+
3+
import (
4+
"log"
5+
6+
"github.com/whhe/mongo-replicator"
7+
"github.com/whhe/mongo-replicator/operator/mongo"
8+
)
9+
10+
func doReplicate(*replicator.Replicator) {}
11+
12+
func ExampleNewReplicator_mongo() {
13+
// create a mongo operator to be used by the replicator
14+
mo, err := mongo.NewOperator("mongodb://localhost:27017")
15+
if err != nil {
16+
log.Fatal(err)
17+
}
18+
19+
// create a replicator using mongo operator
20+
exampleReplicator := replicator.NewReplicator(mo)
21+
22+
doReplicate(exampleReplicator)
23+
}

token/redis/redis_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package redis_test
2+
3+
import (
4+
"log"
5+
6+
"github.com/whhe/mongo-replicator/token/redis"
7+
)
8+
9+
func ExampleNewTokenManager() {
10+
// set redis uri and resume token key
11+
uri := "redis://:password@host:port/db"
12+
key := "resumeToken"
13+
14+
// create a token manager instance
15+
manager, err := redis.NewTokenManager(uri, key)
16+
if err != nil {
17+
log.Fatal(err)
18+
}
19+
defer manager.Close()
20+
21+
// ... get and set resume token ...
22+
}

0 commit comments

Comments
 (0)